結論
map
- ブロック内の評価を返す
- ブロック内の実装で加工したものをそのまま返す
filter_map
- ブロック内の評価が真である配列を返す
例1
以下の例では、どちらも同じ値を持つ配列を返す。
p (1..3).map { |n| n * 3 } => [3, 6, 9]
p (1..3).filter_map { |n| n * 3 } => [3, 6, 9]
map
では、各数値を3倍した値を格納した配列を返しているfilter_map
では、各数値を3倍した値は、それぞれ真なので、それらを格納した配列を返している
では次の例ではどうか。
例2
p (1..3).map { |n| n * 3 if n.even? } => [nil, 6, nil]
p (1..3).filter_map { |n| n * 3 if n.even? } => [6]
even?
で数値が偶数ならtrueが返るmap
では、偶数である2を3倍し、それ以外はnilを格納した配列を返しているfilter_map
では、偶数である2を3倍し、それ以外はnilであり偽なので弾かれて、6のみを格納した配列を返している
まとめ
map
:ブロック内で評価された値を格納した配列を返す。偽な値も含めるfilter_map
:ブロック内で評価された値のうち、真である値を格納した配列を返す