Rubyのラムダで使用されるinjectの動作を理解する
質問
私はよく、事前構成されたラムダを「map」や「select」などの列挙可能なメソッドに接続します。しかし、「inject」の動作は異なるようです。例えばと
mult4 = lambda {|item| item * 4 }
それから
(5..10).map &mult4
私に与えます
[20, 24, 28, 32, 36, 40]
ただし、次のようにインジェクトで使用するために 2 パラメーターのラムダを作成すると、
multL = lambda {|product, n| product * n }
言えるようになりたい
(5..10).inject(2) &multL
「inject」にはオプションがあるため、 シングル 初期値のパラメーターですが、それは私に与えます...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
ただし、「&multL」を 2番 パラメーターを挿入すると機能します。
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
私の質問は、「なぜ前の試みではなく、その方法がうまくいくのか?」です。
解決
その理由は
(5..10).map &mult4
作品と
(5..10).inject(2) &multL
そうでないのは、最初のケースではルビの括弧が暗黙的であるということであり、実際にはそれは意味します
(5..10).map(&mult4)
必要に応じて、2 番目のケースでは使用できます
(5..10).inject 2, &multL
括弧の外側のトリックは、ラムダ オブジェクトではなく、ブロックをメソッドに渡す場合にのみ機能します。
所属していません StackOverflow