【ruby】ブロックの変わりにProcオブジェクトを引数に渡す

ブロックを渡すようなメソッドは、Procオブジェクトを引数として渡すことも出来ます。

普通にブロックを渡すとこんな感じ。

hoge = %w(foo bar piyo)
hoge.each do |val|
  puts val
end

これをProcオブジェクトを引数として渡すとこんな感じになります。

hoge = %w(foo bar piyo)
block = Proc.new {|val| puts val }
hoge.each &block

Procオブジェクトを格納した変数を引数として渡す時に、先頭に「&」をつけると、渡すことができます。

これだけだと、あんまり利用価値が無さそうに思いますが、応用するとかなり便利です。

シンボルの先頭に「&」をつける

引数の先頭に「&」をつけると、Procオブジェクト以外の場合は渡ってきた値に対して「to_proc」メソッドを呼び出した結果が実行されます。

この「to_proc」メソッドはシンボルから呼び出すことができます。

「:upcase」の様な、メソッド名のシンボルに対して「to_proc」を実行すると、「Proc.new {|val| val.upcase }」というようなProcオブジェクトに変換されます。

upcase = :upcase.to_proc # => Procオブジェクトに変換
puts upcase.call 'hoge' # => HOGE

これを応用すると、配列操作を簡略化出来ます。

hoge = %w(foo bar piyo)
hoge.map &:upcase # => [FOO, BAR, PIYO]

簡単なブロックであれば、いちいち書く必要が無くなるので、とても便利です。