0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ProcとLambdaについて

0
Last updated at Posted at 2026-03-21

背景

コードリーディング時、表題について毎回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はスコープを持つのでエラーにならない。

まとめ

もっと深掘りたいのですが、文章を書く体力がここで尽きたので、またの機会にしようと思います。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?