ハッシュの反復処理
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 34/56。
ハッシュは列挙可能なので、配列と同じように反復処理を行うことができます。目的に応じて、3つの一般的なパターンがあります。
each は、キーと値の両方を渡します:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key はキーのみを巡回します:
prices.each_key { |k| puts k } # apple, bread, milkeach_value は値だけを反復処理します:
prices.each_value { |v| puts v } # 1, 3, 4そして、前の章で見たすべてのEnumerableメソッド、map、select、reduceはハッシュでも動作します。各反復でキーと値のペア(または2要素の配列)を受け取るだけです:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}チャレンジ
中級価格リストにセールを適用します。ハッシュ prices が与えられています(アイテムのシンボル => 価格の整数)。
1行の入力を読み込みます。これは、50%割引するアイテムのカンマ区切りリストです(ハッシュ内のシンボル名と一致します)。
以下の順序で出力してください:
- 各アイテムにつき1行、
<item>: <item>: $<final_price>lt;final_price>の形式で出力します。ここで、最終価格はアイテムが割引リストに含まれている場合は割引後の値、そうでない場合は元の値です。eachを使用して反復処理してください。アイテムは元の順序を維持します。割引には整数除算を使用してください(price / 2)。 Was: Was: $<n>lt;n>: 元の合計金額(values.sumを使用)Now: Now: $<n>lt;n>: 割引後の合計金額- 最終価格が依然として
2を超えているアイテムの名前を、,で連結して出力します(新しいハッシュに対してselect+keysを使用)
デフォルトのハッシュで入力が bread,milk の場合、出力は以下のようになります:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseチートシート
each、each_key、each_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 }map、select、reduce などの 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を使用して最終価格のハッシュを作成し、各行、合計、高額商品を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。