49hack

見習いエンジニアが魔法使いになるまで

group_by のときに使う &:hogehoge ってなに?

User.all.group_by(&:age)

レコードをグルーピングするときgroup_byを使いますが、引数の&(アンパサンド、アンド)の挙動をいまいち理解してなかったので調べてみました。

Rubyではメソッド呼び出しの引数に「&手続きオブジェクト」を渡すと、手続きオブジェクトをブロックとして渡すことができます。Ruby 1.8.7以降では「&シンボル」を渡すと、「シンボル.to_proc」をブロックとして渡すことができます。

to_proc (Symbol) - Rubyリファレンス

つまり、以下のように書けてとっても便利です。

# User.all.group_by{|s| s.age } と同じ
User.all.group_by(&:age)

# ["12", "34", "56"].collect {|s| s.to_i } と同じ
["12", "34", "56"].collect(&:to_i)

# [1, 2, 3, nil, 5, 6].select {|s| s.present? } と同じ
[1, 2, 3, nil, 5, 6].select(&:present?)

これはなかなか使えますね〜。(^^)

参考