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