Skip to content

Instantly share code, notes, and snippets.

@kyuden
Last active August 29, 2015 14:04
Show Gist options
  • Save kyuden/f147b86c83a323f4285a to your computer and use it in GitHub Desktop.
Save kyuden/f147b86c83a323f4285a to your computer and use it in GitHub Desktop.
map vs inject vs each_with_object
# map(collect)
### 特徴
レシーバの配列の要素、1つずつに対して処理を行う
一つずつというのが重要で、処理前と処理後の配列のsizeは結局同じ
### 使い所
配列→配列の場合に使う
配列内容の要素すべてを1つずつ同様の処理を行うのに便利
例えば
```ruby
#要素をそれぞれ2倍する
(1..3).map{|i| i*2 }
```
# inject
### 特徴
block内の戻り値をblockの第一引数に代入しながら繰り返す
### 使い所
blockの戻り値は初期値に反映されるので=を使用せず計算できる
```ruby
(1..3).inject(0) {|result, i| result + i }
```
ハッシュなり配列をinjectで作成しようと思うと
ハッシュ、配列に詰める処理がblockでかかれるが
```ruby
[:a, :b, :c].inject({}) {|h, key| h[key] += 1 ; h}
```
h[key] += 1 #=> 1
であるため明示的に戻り値を指定する必要がある
そこで#each_with_object
# each_with_object
### 特徴
初期値で渡すobjectをeach毎に第2引数として使用する
よく使うのはblock内でobjectを破壊的に変更して、結果を次のeachに適用させる方法
### 使い所
配列⇔配列⇔ハッシュ⇔ハッシュの作成
戻り値はblock引数のobjectになるので、そいつを破壊的に変化させればよい
 
```ruby
[:a, :b, :c].each_with_object({}) {|key, object| object[key] = 1 }
```
objectの初期値が配列やハッシュの時、ようは最終的に欲しい値がハッシュや配列の場合
each_with_objectは火を噴く
逆に初期値が数字や文字列の場合は、=ではレシーバを破壊できないので<<を使用したりする必要がある
これは面倒で引っかかる可能性があるので、初期値が文字列や数値の場合はinjectを使う方がよさそう
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment