ラムダを使うべき時とProc.newを使うべき時の違いは?質問する

ラムダを使うべき時とProc.newを使うべき時の違いは?質問する

Ruby 1.8 では、proc/lambda と proc/lambda の間に微妙な違いがありますProc.new

  • その違いは何でしょうか?
  • どれを選択するかを決めるためのガイドラインを教えていただけますか?
  • Ruby 1.9 では、proc と lambda が異なります。何が問題なのでしょうか?

ベストアンサー1

lambdaで作成されたプロシージャと で作成されたプロシージャのもう 1 つの重要かつ微妙な違いは、ステートメントProc.newの処理方法ですreturn

  • 作成されたプロシージャではlambdareturnステートメントはプロシージャ自体からのみ返されます。
  • -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

おすすめ記事