2008-09-19 10 views
5

Я часто подключаю предварительно сконфигурированные lambdas к перечислимым методам, таким как «map», «select» и т. Д. , но поведение «инъекции» кажется другим. , например. сПонимание поведения инъекции, используемого с лямбдой в Ruby

mult4 = lambda {|item| item * 4 } 

затем

(5..10).map &mult4 

дает мне

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

Однако, если я делаю 2-параметра лямбда для использования с Inject, как это так,

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» в второй параметр для инъекции, затем он работает.

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

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

ответ

10

Таким образом, причина того, что

(5..10).map &mult4 

работы и

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

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

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

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

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

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