読者です 読者をやめる 読者になる 読者になる

Effective Rubyを読んで気になったこと(reduce・each_with_object・inject)

途中までですが、Effective Rubyを読んでみました。

Effective Ruby

Effective Ruby

「項目19 reduceを使ってコレクションを畳み込む方法を身に付けよう」を読んだとき、まず恥ずかしながら`reduce`というメソッドを知らなかったです。`inject`は知っていたのですが、そのエイリアスだそうです。

`inject`(`reduce`)と聞くと、自分なら`each_with_object`を使うかなと思いました。細かいですが`inject`だとアキュムレータを返す必要があるからです。
こんなかんじです。
```ruby
[1, 2, 3, 4].inject() do |nums, num|
nums << num * 2
nums
end
```
`each_with_object`だと副作用的に更新していってくれるのでその必要はありません。
```ruby
[1, 2, 3, 4].each_with_object(
) do |num, nums|
nums << num * 2
end
```

### 視点を変えてみる
そもそも`inject`と`reduce`には発想の違いがあるようです。(非常にわかりやすい図とともに説明されています。
[Rubyist Magazine map と collect、reduce と inject ―― 名前の違いに見る発想の違い](http://magazine.rubyist.net/?0038-MapAndCollect))

`reduce`を使うということは、「このコレクションの畳み込みをします。」というのをメソッドで自己ドキュメント的に宣言できるということです。(最低現reduceの単語の意味は知っておく必要がありますが…。)それに対し`each_with_object`は「コレクションのループと同時にこのobjectを更新していきましょう」ということしか読み取れません。畳み込む場合は、多少記述が増えても`reduce`を使うのがいい気がしました。

### 結論
畳み込みする(要素を足しあわせたり、条件に応じて捨てたりする)ときは`reduce`、そうでなく、例えばオブジェクトの`Array`から`Hash`に変換するみたいな場合は`each_with_object`を使うのがよさそう。`inject`はどうしよう>