5

私はよく、事前構成されたラムダを「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

「注入」には初期値のオプションの単一パラメーターがあるため、それは私に...

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

私の質問は、「以前の試みではなく、なぜそれが機能するのですか?」です。

4

1 に答える 1

11

だからその理由

(5..10).map &mult4

動作し、

(5..10).inject(2) &multL

最初のケースではルビーパレンが暗黙的であるということではないので、それは本当に意味します

(5..10).map(&mult4)

必要に応じて、2番目のケースでは使用できます

(5..10).inject 2, &multL

外側のparensトリックは、ラムダオブジェクトではなく、メソッドにブロックを渡す場合にのみ機能します。

于 2008-09-19T14:22:38.290 に答える