Menu
Coddy logo textTech

ハッシュの反復処理

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 34/56。

ハッシュは列挙可能なので、配列と同じように反復処理を行うことができます。目的に応じて、3つの一般的なパターンがあります。

each は、キーと値の両方を渡します:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key はキーのみを巡回します:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value は値だけを反復処理します:

prices.each_value { |v| puts v }   # 1, 3, 4

そして、前の章で見たすべてのEnumerableメソッド、mapselectreduceはハッシュでも動作します。各反復でキーと値のペア(または2要素の配列)を受け取るだけです:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

チャレンジ

中級

価格リストにセールを適用します。ハッシュ prices が与えられています(アイテムのシンボル => 価格の整数)。

1行の入力を読み込みます。これは、50%割引するアイテムのカンマ区切りリストです(ハッシュ内のシンボル名と一致します)。

以下の順序で出力してください:

  1. 各アイテムにつき1行、<item>: <item>: $<final_price>lt;final_price> の形式で出力します。ここで、最終価格はアイテムが割引リストに含まれている場合は割引後の値、そうでない場合は元の値です。each を使用して反復処理してください。アイテムは元の順序を維持します。割引には整数除算を使用してくださいprice / 2)。
  2. Was: Was: $<n>lt;n>: 元の合計金額(values.sum を使用)
  3. Now: Now: $<n>lt;n>: 割引後の合計金額
  4. 最終価格が依然として 2 を超えているアイテムの名前を、, で連結して出力します(新しいハッシュに対して select + keys を使用)

デフォルトのハッシュで入力が bread,milk の場合、出力は以下のようになります:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

チートシート

eacheach_keyeach_value を使用したハッシュの反復処理:

prices = { apple: 1, bread: 3, milk: 4 }

prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }

mapselectreduce などの Enumerable メソッドもハッシュに対して動作し、反復ごとにキーと値のペアを受け取ります:

prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }

便利なハッシュメソッド:すべての値を合計する .values.sum、キーの配列を取得する .keys

自分で試してみよう

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: eachを使用して最終価格のハッシュを作成し、各行、合計、高額商品を出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン