Ruby - лямбда против Proc.new
Возможный дубликат:
В чем разница между proc и лямбдой в Ruby?
При запуске этого кода Ruby
:
def func_one
proc_new = Proc.new {return "123"}
proc_new.call
return "456"
end
def func_two
lambda_new = lambda {return "123"}
lambda_new.call
return "456"
end
puts "The result of running func_one is " + func_one
puts ""
puts "The result of running func_two is " + func_two
В результате я получаю следующее:
The result of running func_one is 123
The result of running func_two is 456
Что касается func_two
, где значение сначала return
, то есть 123
?
Спасибо.
Ответы
Ответ 1
Это одно из основных различий между Procs и lambdas.
Возвращение в Proc возвращается из его вмещающего блока/метода, а возврат в лямбда просто возвращается из лямбда. Когда вы вызываете лямбду внутри func_two, она просто возвращает свое значение на место, которое не сохраняется.
Читайте на Procs v. lambdas здесь:
http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
См. дублирующий вопрос SO:
Почему явный возврат имеет значение в Proc?
EDIT:
Чтобы проиллюстрировать это различие, замените func_one и func_two на блоки и посмотрите, что произойдет:
> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
Ответ 2
В proc, return "123"
пузырится и возвращается из внешней функции, func_one
. Поэтому второй оператор возврата никогда не встречается.
В лямбда return "123"
возвращается только из лямбда. Вы не устанавливаете переменную в возвращаемое значение лямбда (когда вы делаете lambda_new.call
, поэтому значение в основном просто выбрасывается. Затем вызывается return "456"
и возвращается из функции. Если вместо возврата "456"
, вы вернули lambda_new.call
, возвращаемое значение func_two
будет "123"
.
Ответ 3
123
- значение оператора lambda_new.call
, но оно не используется и не отображается.