背景
コードリーディング時、表題について毎回Claudeに聞いているのでまとめたいと思います。
よくある間違い
僕も間違えていて、ご指摘いただ頂いたのですが、ProcとLambdaは対比してはいけないことを学びました。
理由はこちらをご参照ください。
Procの使い方
手続き型のオブジェクトで、処理を一つの塊として扱い、後から呼び出したり、引数を渡したりすることができる。
name = Proc.new { |name| puts "#{name}" }
name.call("taro")
# => taro
Lambda(無名関数)の使い方
Pracオブジェクトを生成することができる。メソッドや関数と同じでスコープを持ち、引数の受け取りやreturnが使える。
name = lambda { |name| return "#{name}" }
name.call("taro")
# => taro
定義時に名前を持たないから無名関数というらしい。初めて知った。
それぞれの注意点
引数チェックの厳格さ
Procの場合
full_name = Proc.new { |first_name, last_name| puts "#{first_name} #{last_name}" }
full_name.call("sato")
# => sato
第二引数をnilとして扱うため、渡さなくてもエラーにならない。
Lambdaの場合
full_name = lambda { |first_name, last_name| puts "#{first_name} #{last_name}" }
full_name.call("sato")
# => wrong number of arguments (given 1, expected 2) (ArgumentError)
第二引数まで渡してあげないとエラーになる。
returnの挙動
Procの場合
greeting = Proc.new { return "My name is Sato Taro." }
greeting.call
# => unexpected return (LocalJumpError)
このような使い方をすることはないと思いますが、Procではreturnを使用するとエラーになります。
returnはスコープから出ようとするので、スコープを持たないためエラーになるようです。
Lambdaの場合
greeting = lambda { return "My name is Sato Taro." }
greeting.call
# => "My name is Sato Taro."
冒頭でも記載したように、Lambdaはスコープを持つのでエラーにならない。
まとめ
もっと深掘りたいのですが、文章を書く体力がここで尽きたので、またの機会にしようと思います。