0

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
4

2 に答える 2

1

メソッドのソース コード(ドキュメント ページの [ソースの表示] をクリック) を見ると、パラメーターが ではないdetect場合にのみ実行を試みることがわかります。call nil

if (!NIL_P(if_none)) {
  return rb_funcall(if_none, id_call, 0, 0);
}
于 2013-03-29T18:37:33.960 に答える
0

一致するオブジェクトがない場合は、ifnone を呼び出し、指定されている場合はその結果を返し、それ以外の場合は nil を返します。

その文を意図したものとは異なる方法で解析していると思います。ここでの意味は次のとおりです。

if no object matches
  if ifnone is set
    return ifnone.call
  else
    return nil
  end
end

nil引数として渡すとifnone未設定とみなされて呼び出されません。それ以外の値を渡した場合にのみ呼び出されますnil

于 2013-03-29T18:38:01.240 に答える