Last active
August 29, 2015 14:04
-
-
Save kyuden/f147b86c83a323f4285a to your computer and use it in GitHub Desktop.
map vs inject vs each_with_object
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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