可能性のある複製:
Rubyのprocとlambdaの違いは何ですか?
この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
、firstreturn
の値、つまり123
?
ありがとう。
これは、Procsとラムダの主な違いの1つです。
Procでの戻り値は、それを囲むブロック/メソッドから戻りますが、ラムダでの戻り値は、単にラムダから戻ります。 func_two内でラムダを呼び出すと、その値が適切な場所に返されるだけで、保存されません。
ここでProcs v。lambdasを読んでください: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
重複するSO質問: なぜ明示的なリターンがProcに違いをもたらすのか?
編集:
この違いをさらに説明するために、func_oneとfunc_twoをブロックに交換し、何が起こるかを見てください:
> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
プロシージャでは、_return "123"
_がバブリングして、外部関数_func_one
_から戻ります。したがって、2番目のreturnステートメントは検出されません。
ラムダでは、_return "123"
_はラムダからのみ返されます。変数をラムダの戻り値に設定していません(_lambda_new.call
_を実行するとき、そのため、値は基本的にスローされます。その後、_return "456"
_が呼び出され、関数から戻ります。 、_"456"
_を返す代わりに、_lambda_new.call
_を返しました。_func_two
_の戻り値は_"123"
_になります。
123
はlambda_new.call
ステートメントの値ですが、使用されず、表示されません。