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

lambdaprocの一種だが、二つの大きな違いがある。

  1. 引数の数が厳密。
  2. returnキーワードの挙動が異なる。
l = lambda { |n| n * 2 }
puts l.call(5)  # => 10

ラムダは引数の数が厳密にチェックされるため、引数の数が間違っているとエラーが発生する。
また、ラムダ内でreturnを使った場合、ラムダ自体が終了するが、その外側のスコープには影響を与えない。

まとめ

  • ブロック: 一時的な無名コード片。保存や再利用は基本的にされない。
  • プロック: ブロックをオブジェクト化して保存・再利用できる。引数の数が厳密でない。
  • ラムダ: 引数の数が厳密で、returnの挙動が異なるプロック。