Rubyのブロック、プロック、ラムダについて
block
block
はコードのまとまりや一連の命令を表す、Rubyの基本的な構造の一つ。
通常、{} または do..end で囲まれる。
ブロックは、メソッドに対してコードのまとまりを渡すことができ、そのメソッド内で呼び出すことができる。
[1, 2, 3].each do |n|
puts n * 2
end
この例では、each
メソッドにブロックが渡されている。
ブロックは一般に一時的な処理を実行するために使用され、保存や再利用は基本的にされない。
proc
Proc
は、ブロックをオブジェクトとして保存するためのもの。
double = Proc.new { |n| n * 2 }
puts double.call(5) # => 10
blockを変数に保存したり、メソッドに引数として渡すことができる。
lambda
lambda
もproc
の一種だが、二つの大きな違いがある。
- 引数の数が厳密。
return
キーワードの挙動が異なる。
l = lambda { |n| n * 2 }
puts l.call(5) # => 10
ラムダは引数の数が厳密にチェックされるため、引数の数が間違っているとエラーが発生する。
また、ラムダ内でreturn
を使った場合、ラムダ自体が終了するが、その外側のスコープには影響を与えない。
まとめ
- ブロック: 一時的な無名コード片。保存や再利用は基本的にされない。
- プロック: ブロックをオブジェクト化して保存・再利用できる。引数の数が厳密でない。
- ラムダ: 引数の数が厳密で、
return
の挙動が異なるプロック。