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

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?

Спасибо.

4b9b3361

Ответ 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, но оно не используется и не отображается.