Различия между Proc и Lambda - PullRequest
       2

Различия между Proc и Lambda

21 голосов
/ 26 января 2011

Ruby имеет различия между процессами, созданными с помощью Proc.new и lambda (или оператора ->() в 1.9). Похоже, что не-лямбда-Procs разделит массив, переданный через аргументы блока; Проки созданные через лямбду не делают.

p = Proc.new { |a,b| a + b}
p[[1,2]] # => 3

l = lambda { |a,b| a + b }
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2)

Есть ли у кого-нибудь понимание мотивов такого поведения?

1 Ответ

39 голосов
/ 26 января 2011

Существует два основных различия между лямбдами и не лямбдами Proc с:

  1. Точно так же, как методы, лямбды возвращаются из себя, тогда как не-лямбда Proc s возвращаются из метода вложения, точно так же, как блоки.
  2. Так же, как методы, у лямбд есть строгая проверка аргументов, тогда как у не-лямбда Proc есть свободная проверка аргументов, как и у блоков.

Или, короче говоря: лямбды ведут себя как методы, не лямбды Proc ведут себя как блоки.

То, что вы видите, это пример № 2. Попробуйте это с блоком и методом в дополнение к не лямбда Proc и лямбда, и вы увидите. (Без этого поведения Hash#each было бы реальным PITA для использования, поскольку действительно дает массив с двумя элементами, но вы почти всегда хотите рассматривать его как два аргументы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...