Just do IT

思うは招く

Ruby の map と filter_map の違い

結論

  • 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:ブロック内で評価された値のうち、真である値を格納した配列を返す