Menu
Coddy logo textTech

Hashの反復処理

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 が与えられます(item symbol => price integer)。

入力を1行読み込みます:カンマ区切りの50%割引対象のitems(ハッシュ内のシンボルと名前が一致するもの)。

次の順番で出力します:

  1. 各itemにつき、<item>: $<final_price> 形式で1行出力します。final priceは、そのitemがdiscountリストに含まれている場合は割引後の値、そうでない場合は元の値です。each を使って反復します。itemsは元の順序を維持します。割引には整数除算を使用してくださいprice / 2)。
  2. Was: $<n>:元の合計(values.sum を使用)
  3. Now: $<n>:割引後の合計
  4. final priceが引き続き 2 を上回るitemsの名前を、, で連結します(新しいハッシュに対して 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 で final-price ハッシュを構築する; 行、合計、高価なアイテムを出力する
quiz icon腕試し

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

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

自分で練習してみよう: Rubyオンラインコンパイラ