enum#detect说:
将每个条目以枚举形式传递到块中。返回第一个不为false的块。如果没有匹配的对象,则调用ifnone并在指定时返回其结果,否则返回nil。
现在我正在尝试以下几点:
nil.call
#NoMethodError: undefined method `call' for nil:NilClass
# from (irb):13
# from C:/Ruby200/bin/irb:12:in `<main>'
(1..10).detect(x = 2) { |i| i % 5 == 0 and i % 7 == 0 }
#NoMethodError: undefined method `call' for 2:Fixnum
# from (irb):15:in `detect'
# from (irb):15
from C:/Ruby200/bin/irb:12:in `<main>'现在,我的问题是,为什么下面没有发生相同的错误:
(1..10).detect(x = nil) { |i| i % 5 == 0 and i % 7 == 0 }
#=> nil
(1..10).detect(x = nil) { |i| p x; i % 5 == 0 and i % 7 == 0 }
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#=> nil发布于 2013-03-29 18:37:33
如果您查看detect方法的源代码(在文档页面上单击“查看源代码”),您将看到只有当参数是而不是 nil时,它才会尝试执行call
if (!NIL_P(if_none)) {
return rb_funcall(if_none, id_call, 0, 0);
}发布于 2013-03-29 18:38:01
如果没有匹配的对象,则调用ifnone并在指定时返回其结果,否则返回nil。
我认为你对这句话的解析与它的意图不同。这里的意思是:
if no object matches
if ifnone is set
return ifnone.call
else
return nil
end
end如果您传入nil作为参数,那就等于没有设置ifnone,所以不会调用它。只有在传递nil以外的值时,它才会被调用。
https://stackoverflow.com/questions/15709295
复制相似问题