Procはなんのためにあるのか

ブロックはオブジェクトではない。が、ブロックを後で実行したいときがある。

そういうときにProcを使う。Procはブロックをオブジェクトにしたもの。

以下、「メタプログラミングRuby 第2版」から引用

inc = Proc.new{|x| x + 1 }
inc.call(2) # => 3

incというブロックをオブジェクト化したもの(Procオブジェクト)に対し、callを実行するとブロック中身が実行される

&修飾子をつけるケース

メソッド内でブロックを実行するときはyieldを使う

が、他のメソッドにブロックを渡すときやブロックをProcに変換したいときなど、ブロックに特定の名前をつけてこのブロックを実行する、と書きたい場合がある

そのときはメソッド内でyieldで呼ぶのではなく、メソッドの引数にブロックを渡して、メソッドの引数の定義には &ブロックの名前 を書く

以下、「メタプログラミングRuby 第2版」から引用

def math(a, b)
  yield(a, b)
end

def do_math(a, b, &operation)
  math(a, b, &operation)
end

do_math(a, b) {|x, y| x * y} # => 6