athome-developer’s blog

不動産情報サービスのアットホームの開発者が発信するブログ

LodashとLINQの対応表にRubyを足してみる(そしてSymbol#to_proc)

情報システム部の山田です。こんにちは。
先日当社の高野さんがこんな記事を書いてくれたので乗っかってみよう!というわけで一覧表に、Rubyだとこれだよっ!を追加してみました。

Rubyだとこのメソッド

LINQ Lodash Ruby
射影 Select map map, collect
フィルター Where filter select, find_all
昇順ソート OrderBy orderBy sort, sort_by
降順ソート OrderByDescending orderBy sort, sort_by
グループ化 GroupBy groupBy group_by
存在確認 Any some any?
最初の要素取得 First find first
最後の要素取得 Last findLast last
一意の要素取得 Distinct uniq uniq
和集合 Union union Set#union, Set#+
差集合 Except difference Set#difference, Set#-
積集合 Intersect intersection Set#intersection, Set#&
平坦化 SelectMany flatten flatten
スキップ Skip drop delete, delete_at
指定数要素取得 Take take take
合計計算 Sum sum inject(&:+), reduce(&:+), sum*1
最大値取得 Max max max
最小値取得 Min min min
集合関連のメソッドについて

集合に関してはArrayクラスではなくSetクラスのメソッドになります。
Setもうまく使うとかなり便利なので、この機に見直しておくのもおすすめです。
library set (Ruby 2.3.0)

合計計算について

合計計算のsumメソッドはRuby本体にはないのですが、RailsというかActiveSupportにはsumがあります。
Rails全部じゃなく、ActiveSupportだけ導入するのもアリだと思いますし、逆にRailsからRuby始めましたという人にとっては、当たり前にあるメソッドが実はActiveSupportのものだったという点を把握しておくと、後々役立つのではないかと思います。
ほかにも便利なメソッドが追加されるので、こちらも一度見ておくと色々捗りますよ。
Active Support コア拡張機能 | Rails ガイド

Symbol$to_procの話

で、「合計計算」がなんだかよくわからない感じになっているのですが、sumを使わない(使えない)場合はinject(もしくは別名のreduce)というたたみこみを行うメソッドを使います。
実はActiveSupportsumメソッドの実装もそうなってるのですけど。

injectメソッドを普通に書き下すと

[1, 2, 3, 4, 5].inject {|result, item| result += item }

みたいな感じになるのですが、ブロック内で単純なメソッドを適用するような場合に使われるinstance method Symbol#to_proc (Ruby 2.3.0)というものがあります。
それを使うと

[1, 2, 3, 4, 5].inject(&:+)

と、かなり短くかけちゃうので、結構使われてます。
injectに限らず、例えば微妙な例ですが、数値をすべて文字列にしたい場合も

[1, 2, 3, 4, 5].map { |item| item.to_s }

ではなく

[1, 2, 3, 4, 5].map(&:.to_s)

となります。
上のSymbol#to_procじゃない書き方すると、レビューで指摘されること間違いなしでしょう。

では。

*1:ActiveSupport使用時