web-dev-qa-db-ja.com

Ruby-lambda vs. Proc.new

可能性のある複製:
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_twofirstreturnの値、つまり123

ありがとう。

39
Simplicity

これは、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
...
28
numbers1311407

プロシージャでは、_return "123"_がバブリングして、外部関数_func_one_から戻ります。したがって、2番目のreturnステートメントは検出されません。

ラムダでは、_return "123"_はラムダからのみ返されます。変数をラムダの戻り値に設定していません(_lambda_new.call_を実行するとき、そのため、値は基本的にスローされます。その後、_return "456"_が呼び出され、関数から戻ります。 、_"456"_を返す代わりに、_lambda_new.call_を返しました。_func_two_の戻り値は_"123"_になります。

4
Emily

123lambda_new.callステートメントの値ですが、使用されず、表示されません。

0
Victor Deryagin