【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]
簡単なブロックであれば、いちいち書く必要が無くなるので、とても便利です。