Ruby 1.8 では、proc/lambda と proc/lambda の間に微妙な違いがありますProc.new
。
- その違いは何でしょうか?
- どれを選択するかを決めるためのガイドラインを教えていただけますか?
- Ruby 1.9 では、proc と lambda が異なります。何が問題なのでしょうか?
ベストアンサー1
lambda
で作成されたプロシージャと で作成されたプロシージャのもう 1 つの重要かつ微妙な違いは、ステートメントProc.new
の処理方法ですreturn
。
- 作成されたプロシージャでは
lambda
、return
ステートメントはプロシージャ自体からのみ返されます。 - -created procでは
Proc.new
、このreturn
ステートメントはもう少し驚くべきものになります。proc からだけでなく、proc を囲むメソッドからも制御が返されるのです。
ここで、lambda
-created proc のreturn
動作を示します。これは、おそらく予想どおりに動作します。
def whowouldwin
mylambda = lambda {return "Freddy"}
mylambda.call
# mylambda gets called and returns "Freddy", and execution
# continues on the next line
return "Jason"
end
whowouldwin
#=> "Jason"
ここで、同じことを実行するProc.new
-created proc をreturn
見てみましょう。これは、Ruby が誇る「驚き最小の原則」に違反するケースの 1 つです。
def whowouldwin2
myproc = Proc.new {return "Freddy"}
myproc.call
# myproc gets called and returns "Freddy",
# but also returns control from whowhouldwin2!
# The line below *never* gets executed.
return "Jason"
end
whowouldwin2
#=> "Freddy"
この驚くべき動作のおかげで(そして入力が少なくて済むので)、私はプロセスを作成するときにlambda
よりも を使用することを好む傾向がありますProc.new
。