ハッシュの反復処理
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部。レッスン 34/56。
ハッシュは Enumearble なので、配列と同じように反復処理(ループ)ができます。目的に応じて、主に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 が与えられています(item シンボル => price 整数)。
1行の入力を読み込みます: 50%割引する itemsのカンマ区切りリスト(ハッシュ内のシンボル名と一致します)。
次の順番で出力してください:
- 各
itemについて<item>: $<final_price>の形式で1行ずつ出力します。itemがdiscountリストにある場合は割引後の価格、そうでない場合は元の価格です。eachでループ処理してください。itemsの元の順序を維持します。割引には整数除算を使用してください(price / 2)。 Was: $<n>: 元の合計金額(values.sumを使用)Now: $<n>: 割引後の合計金額- 最終価格がまだ
2より大きいitemsの名前を,で連結したもの(新しいhashに対してselect+keysを使用)
デフォルトのハッシュに対して入力が bread,milk の場合、出力は以下のようになります:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese自分で試してみよう
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: eachで最終価格ハッシュを構築する; 行、合計、高価なアイテムを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ