maeshimaの日記

メモ書きです

演算子以外の"&"の使い方

復習復習!

メソッド宣言時

& メソッド宣言の中で、最後のメソッド引数の名前の前に付けて、メソッドに渡されたブロックをその引数に代入できるようにする。

メソッド呼び出し時

メソッド呼び出しの中で、メソッドにまるでブロックのようにprocを渡すときにも使われる。

a, b = [1,2,3], [4,5]
summation = Proc.new {|total,x| total + x}
sum = a.inject(0, &summation) #=> 6
sum = b.inject(sum, &summation) # => 15

to_proc

to_procメソッドを持つオブジェクトなら、何でも & を付けられる。Symbolクラスにto_procが定義されて(1.8.7以降)おり、イテレータに渡すことが出来る。Symbolクラスのto_procメソッドが返すProcオブジェクトは、第一引数をレシーバとしてSymbol名のメソッドを呼び出し、引数として残りの引数を渡す。

words = %w( and but car )
uppercase = words.map &:upcase #=>["AND", "BUT", "CAR"]