これらはRubyがコードのかたまりをデータとして扱う3つの方法です。ブロックはメソッドに渡されます(オブジェクトではありません)。Procとラムダはブロックをラップしたオブジェクトです(呼び出し可能で、保存できます)。Procとラムダは引数チェックとreturnの振る舞いにおいて微妙に異なります。
ブロック — メソッドに渡される(オブジェクトではない)
[, , ].each { || puts n }
ブロックはメソッドに渡されるコード({ }またはdo...end内)です。単独で保存できるオブジェクトではなく、メソッド呼び出しに結びついています。
# a Proc — a block turned into an object you can store and call
square = Proc.new { |x| x * x }
square.call(5) # 25
square.(5) # 25 (alternate call syntax)
# a lambda — also a callable object (a "stricter" Proc)
double = lambda { |x| x * 2 }
double = ->(x) { x * 2 } # the -> "stabby lambda" syntax
double.call(5) # 10
Procとラムダはブロックをオブジェクトにラップし、変数に代入したり、渡し回したり、後で呼び出したり(.call)できます。再利用可能な振る舞いを保存するのに便利です。
1. ARGUMENT CHECKING:
lambda → STRICT: errors if wrong number of arguments (like a method)
proc → LENIENT: ignores extra args, fills missing with nil
2. RETURN behavior:
lambda → `return` returns from the LAMBDA (like a normal method)
proc → `return` returns from the ENCLOSING METHOD (can surprise you!)
def test_proc
p = Proc.new { return 10 }
p.call # returns from test_proc ENTIRELY → 10
return 20 # never reached!
end
def test_lambda
l = lambda { return 10 }
l.call # returns from the LAMBDA only → 10
return 20 # reached → test_lambda returns 20
end
最も重要な違いは、ラムダはメソッドのように振る舞う(厳密な引数チェック、returnはラムダだけを抜ける)のに対し、Procはより寛容(引数の不一致を無視し、returnは囲んでいるメソッドを抜ける——これは予期しない振る舞いを引き起こす可能性がある)という点です。一般的にはラムダが好まれます。メソッドのような予測可能な振る舞いをするためです。
ブロック、Proc、ラムダ——特にその違い——を理解することは重要なRubyの知識であり、Rubyがコードをデータとして扱う仕組みへのより深い理解を反映します。ブロックは最も一般的(反復処理やコールバックのためにメソッドに渡される——Rubyの代表的な機能)であり、一方Procとラムダはブロックを保存可能で再利用可能なオブジェクトに変え、変数に代入したり、渡し回したり、後で呼び出したりできます(振る舞いの保存、関数型パターンの構築、コールバックを値として渡すのに便利)。
Procとラムダの重要な違いは微妙ですが重要で、面接でも頻出のテーマです。引数チェック(ラムダはメソッドのように厳密、Procは寛容)、そして特に**returnの振る舞い**(ラムダのreturnはラムダだけを抜けるのに対し、Procのreturnは囲んでいるメソッドを抜ける——これは予期しない、デバッグの難しい振る舞いを引き起こす可能性がある)です。
これらの違い——ラムダはメソッドのように振る舞う(厳密で予測可能、returnが局所化される)のに対し、Procはより寛容で予期しないreturnのセマンティクスを持つ——を理解することは、それらを正しく使うため、そして予測可能でメソッドのような振る舞いゆえにラムダを好むという一般的な推奨のために重要です。
ブロックは日常的なRubyであり、Proc/ラムダは保存可能なコールバックや関数型パターンに使われますが、これら3つすべて(特にProcとラムダのreturnと引数の違い)を理解することは堅実なRubyの知識を反映し、Procのreturnの落とし穴を避けるのに役立ち、Rubyがコードをオブジェクトとして扱う仕組みを真に理解している開発者を見分ける古典的な面接テーマです。