Procクラスについて

Rubyの「Procクラス」について学んだことをまとめてみました。Procはブロックとして記述された一連の手続きを受け渡しするためのクラスです。

Procクラスとは

Procを理解するにあたりポイントとなるのがブロックです。ブロックはdo ~ endまたは{ ~ }の形で引数として渡されるものを言います。
yieldを使うと受け取り側は引数を明示することなく処理することができます。

def msg
  yield
end
msg do
  puts "メッセージ"
end
#実行結果
=>"メッセージ"

ブロックをオブジェクト化したものがProc.newです。受け取り側は明示的に引数を書くことができ、下記のように&でブロックがメソッドに渡ってきたときにProcオブジェクトになります。
&によってブロックがProcオブジェクトに変換され、callメソッドによって評価されます。

def msg(&block)
  block.call
end
msg do
  puts "メッセージ"
end
#実行結果
=>"メッセージ"

Rubyはほぼすべてがオブジェクトとして扱われますが、ブロックはオブジェクトではありません。ブロックをオブジェクト化したものがProc.newです。

&について

&で引数にブロックを渡すとProcに変換される仕組みですが、「&オブジェクト」形式で渡すとオブジェクト.to_procが自動的に呼ばれるようになってます。