45

重複の可能性:
Ruby の proc とラムダの違いは何ですか?

この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の値はどこにありますか? return123

ありがとう。

4

3 に答える 3

38

これは、Procs とラムダの主な違いの 1 つです。

Proc の return は、それを囲んでいるブロック/メソッドから戻りますが、lambda の return は単に lambda から戻ります。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
...
于 2011-08-12T16:25:36.083 に答える
4

proc では、return "123"が泡立ち、外側の関数 から戻りfunc_oneます。したがって、2 番目の return ステートメントに遭遇することはありません。

ラムダでは、return "123"ラムダからのみ返されます。変数をラムダの戻り値に設定していない (lambda_new.callそうすると、値は基本的に単にスローされます。その後、return "456"が呼び出されて関数から戻ります。 を返す代わりに を返した場合、"456"戻りlambda_new.call値はの値はfunc_twoになります"123"

于 2011-08-12T16:25:53.323 に答える
0

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

于 2011-08-12T16:26:04.463 に答える