導入
each・map・select・reduce の他にも、配列やハッシュをまとめて処理できる便利なメソッドがたくさんあります。ここでは実務でもよく使う3つを紹介します。
説明
words = ["apple", "banana", "avocado", "blueberry", "cherry"]
grouped = words.group_by { |w| w[0] }
puts grouped.inspect
lengths = words.each_with_object({}) { |w, h| h[w] = w.length }
puts lengths.inspect
sorted = words.sort_by { |w| w.length }
puts sorted.inspect
group_by { ブロック }は、ブロックの結果ごとに要素をグループ分けしたハッシュを作ります。ここでは頭文字ごとにグループ化しています(w[0]は文字列の0番目の文字)。each_with_object(入れ物)は、指定した入れ物(ここでは空のハッシュ{})を毎回のブロックに渡しながら育てていきます。reduceに似ていますが、戻り値の組み立てがh[key] = valueのように直感的に書けます。sort_by { ブロック }は、ブロックの結果を基準にして並び替えます。.sortが要素そのものを直接比較するのに対して、sort_byは「何を基準に並べるか」を柔軟に指定できます。
やってみよう
group_by の基準を「文字数が偶数か奇数か(w.length.even?)」に変えてみましょう。sort_by を { |w| -w.length } に変えると降順になることも確かめてください。
演習
配列 nums = [1, 2, 3, 4, 5, 6] を group_by で「偶数・奇数」に分け、.inspect で表示してください({false=>[1, 3, 5], true=>[2, 4, 6]})。
ヒント1を見る
nums.group_by { |n| n.even? } の結果を .inspect で表示します。
ヒント2を見る
group_by はブロックの結果(true/false)をキーにしたハッシュを作ります。