Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

  • Подобно методам, lambdas возвращается от себя, тогда как non-lambda Proc возвращается из метода размещения, подобно блокам.
  • Подобно методам, lambdas имеет строгую проверку аргументов, в то время как non-lambda Proc имеет проверку правильных аргументов, подобно блокам.

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

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