LoginSignup
11
9

More than 5 years have passed since last update.

ブロックの省略

Posted at

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

簡潔に書けるのはやっぱりいいですね。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9