对于Fibers,我们有一个典型的例子:生成Fibonacci数
fib = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x,y = y,x+y
end
end
Run Code Online (Sandbox Code Playgroud)
为什么我们需要光纤呢?我可以用相同的Proc重写这个(实际上是闭包)
def clsr
x, y = 0, 1
Proc.new do
x, y = y, x + y
x
end
end
Run Code Online (Sandbox Code Playgroud)
所以
10.times { puts fib.resume }
Run Code Online (Sandbox Code Playgroud)
和
prc = clsr
10.times { puts prc.call }
Run Code Online (Sandbox Code Playgroud)
将返回相同的结果.
那么纤维有什么优点呢?我可以用Fibers写什么样的东西我不能用lambdas和其他很酷的Ruby功能?
我想在Rails环境的上下文中运行Ruby文件.rails runner几乎可以做我想做的事,但我想给它一个文件名和参数.我很确定这是可能的,因为我以前做过.有人能提醒我怎么做吗?
我想在以下位置显示标签form_for:
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
Run Code Online (Sandbox Code Playgroud)
这会生成标签"Name",但我希望它是"你的名字".我该怎么改变它?
如果我有一个Time对象来自:
Time.now
Run Code Online (Sandbox Code Playgroud)
然后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在接下来的几分钟甚至几小时内创建相同的分钟.
我安装了Active Support 3.0.3,使用Ruby 1.8.7安装了Rails 3.0.3.
当我尝试使用时,1.week.ago我得到了
NoMethodError: undefined method 'week' for 1:Fixnum
from (irb):2
Run Code Online (Sandbox Code Playgroud)
其他核心扩展似乎有效.我在一个朋友的计算机上尝试过(同样的安装规范和旧版本),结果相同.
是什么赋予了?
所有这些都在IRB中.
我们可以像在java中那样公开Ruby中的接口,并强制执行Ruby模块或类来实现接口定义的方法.
一种方法是使用继承和method_missing来实现相同的目标,但还有其他更合适的方法吗?
当名称包含在字符串变量中时,如何动态调用方法?例如:
class MyClass
def foo; end
def bar; end
end
obj = MyClass.new
str = get_data_from_user # e.g. `gets`, `params`, DB access, etc.
str #=> "foo"
# somehow call `foo` on `obj` using the value in `str`.
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这样做是否存在安全风险?
假设我有一个日期时间对象,例如DateTime.now.我想将小时和分钟设置为0(午夜).我怎样才能做到这一点?
假设我们有这样的字符串:
Hello, my\n name is Michael.
Run Code Online (Sandbox Code Playgroud)
如何删除该新行并将其后的那些空格删除到字符串内部以获取此内容?
Hello, my name is Michael.
Run Code Online (Sandbox Code Playgroud) 我似乎无法找到有关自定义异常类的更多信息.
我所知道的
您可以声明自定义错误类并让它继承StandardError,因此它可以是rescued:
class MyCustomError < StandardError
end
Run Code Online (Sandbox Code Playgroud)
这允许您使用以下方法来提高它:
raise MyCustomError, "A message"
Run Code Online (Sandbox Code Playgroud)
然后,在救援时获取该消息
rescue MyCustomError => e
puts e.message # => "A message"
Run Code Online (Sandbox Code Playgroud)
我不知道的
我想给我的异常一些自定义字段,但我想message从父类继承该属性.我发现阅读关于这个主题是@message不是异常类的实例变量,所以我很担心我的遗产将无法正常工作.
谁能给我更多细节呢?如何使用object属性实现自定义错误类?以下是正确的:
class MyCustomError < StandardError
attr_reader :object
def initialize(message, object)
super(message)
@object = object
end
end
Run Code Online (Sandbox Code Playgroud)
然后:
raise MyCustomError.new(anObject), "A message"
Run Code Online (Sandbox Code Playgroud)
要得到:
rescue MyCustomError => e
puts e.message # => "A message"
puts e.object # => anObject
Run Code Online (Sandbox Code Playgroud)
它会起作用,如果确实如此,这是正确的做事方式吗?
ruby inheritance exception-handling exception custom-exceptions