mapやselectなどを使うとき、ブロックの中にレシーバーに行う処理を書きます。
言葉で説明するのは難しいので簡単なコードを以下に記述します。
sample1.rb
['tarou', 'hanako'].map { |i| i.capitalize } # => ["Tarou", "Hanako"]
[1, 2, 3].select { |i| i.even? } # => [2]
ただこういう単純な処理に毎回ブロックを書くのは正直めんどくさいです・・・。
そういう時Rubyには簡単に書く方法があります。
コードは下のようになります。
sample2.rb
['tarou', 'hanako'].map(&:capitalize) # => ["Tarou", "Hanako"]
[1, 2, 3].select(&:even?) # => [2]
以上のようにメソッドがあるものは簡潔に書くことが可能です。
もちろん自分が書いたメソッドにも使うことができます。
あまりよくない例だと思いますが、下にコードを書きます。
sample3.rb
class Fixnum
def my_even?
if self % 2 == 0
true
else
false
end
end
end
[1, 2, 3].select(&:my_even?) # => [2]
injectの場合は&(アンパサンド)も省略できます。
下のコードは1~10の合計を求めます。
sample4.rb
a = [*1..10]
a.inject(&:+) # => 55
a.inject(:+) # => 55
簡潔に書けるのはやっぱりいいですね。