本文へスキップ
BecomeCoder

Rubyコース · 第6章 ブロックとイテレータ · レッスン28

よく使うEnumerable ― group_by・each_with_object・sort_by

ブラウザで完結

導入

eachmapselectreduce の他にも、配列ハッシュをまとめて処理できる便利なメソッドがたくさんあります。ここでは実務でもよく使う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)をキーにしたハッシュを作ります。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。