1. ホーム
  2. ruby

[解決済み] lambdaを使うべきか、Proc.newを使うべきか?

2022-03-17 02:53:33

質問

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

  • その違いとは何でしょうか?
  • どちらを選ぶべきかの判断の目安を教えてください。
  • Ruby1.9ではprocとlambdaは別物です。どうなっているんだ?

どのように解決するのか?

で作成されたプロックのもう一つの重要な、しかし微妙な違い。 lambda で作成されたプロックと Proc.new をどのように扱うかです。 return ステートメントを使用します。

  • の中に lambda -が作成されたプロックでは return 文はプロック自身からしか返しません
  • での Proc.new -を作成したプロックでは return 文はもう少し驚くべきもので、procからだけでなく、コントロールを返すのです。 のみならず、その proc を包含するメソッドからも取得できるのです!

ここで lambda -作成されたプロックの 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 -を作成したプロックの return が同じことをやっている。Rubyが「最小驚きの法則」を破るケースをご覧ください。

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 を作成する際に使用します。