Понимание поведения инжекта, используемого с лямбдой в Ruby - PullRequest
5 голосов
/ 19 сентября 2008

Я часто подключаю предварительно сконфигурированные лямбды к перечисляемым методам, таким как «карта», «выбор» и т. Д. но поведение «впрыскивать» кажется другим. например с

mult4 = lambda {|item| item * 4 }

тогда

(5..10).map &mult4

дает мне

[20, 24, 28, 32, 36, 40]

Однако, если я сделаю лямбду с двумя параметрами для использования с инъекцией, как это,

multL = lambda {|product, n| product * n }

Я хочу иметь возможность сказать

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

, поскольку в 'inject' есть необязательный параметр single для начального значения, но это дает мне ...

irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
        from (irb):27:in `inject'
        from (irb):27

Однако, если я вставлю '& multL' в параметр second для ввода, то это сработает.

irb(main):028:0> (5..10).inject(2, &multL)
=> 302400

Мой вопрос: «Почему это работает, а не с предыдущей попыткой?»

1 Ответ

11 голосов
/ 19 сентября 2008

Итак, причина, по которой

(5..10).map &mult4

работает и

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

не означает, что в первом случае неявно указывается рубин, поэтому на самом деле это означает

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

если хотите, для второго случая вы можете использовать

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

Внешний трюк с паренсом работает только для передачи блоков методу, а не лямбда-объектам.

...