はじめに
配列に使用できる便利なメソッドを探していた際に、flat_map
とそのエイリアスメソッドであるcollect_concat
を見つけたので忘備録として残します。
flat_map/collect_concatとは?
flat_map -> Enumerator[permalink][rdoc]
collect_concat -> Enumerator
flat_map {| obj | block } -> Array
collect_concat {| obj | block } -> Array
各要素をブロックに渡し、その返り値を連結した配列を返します。
ブロックの返り値は基本的に配列を返すべきです。
ブロックを省略した場合は、ブロックを受けとり 上で説明した評価をし、その結果の配列を返す Enumerator オブジェクトを返します。 (参照先はページ下記)
Example
pry(main)> arry
=> [[1, 2, 3,"z"], ["a",4], ["b",5]]
pry(main)> arry.flat_map { |a| a.grep(Integer) }
=> [1, 2, 3, 4, 5]
pry(main)> arry.collect_concat { |a| a.grep(Integer) }
=> [1, 2, 3, 4, 5]
イメージとしてはmap
とflatten
が合体したようなものです。
ネストしている配列をなくしてくれる上に、その結果を新たにフラットな配列として返してくれます。
pry(main)> arry
=> [[1, 2, 3, "a"], ["a", 5], ["b", 3]]
pry(main)> arry.flatten
=> [1, 2, 3, "a", "a", 5, "b", 3]
pry(main)> arry
=> [[1, 2, 3, "a"], ["a", 5], ["b", 3]]
pry(main)> arry.map { |a| a.grep(Integer) }
=> [[1, 2, 3], [5], [3]]
(参考)
flattenメソッド
mapメソッド
オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル
##おわりに
以上、ご一読ありがとうございました。
何かご指摘ございましたら、コメントいただけると幸いです。