質問

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top