enum#detect
言います:
列挙型の各エントリをブロックに渡します。block が 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