Menu
Coddy logo textTech

ネストしたハッシュ

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

ハッシュの値自体をハッシュにすることができます。このネスト(入れ子)構造は、Rubyのコードが構造化されたレコードを表現する際の典型的な方法であり、id(または名前)をキーとした単一のハッシュで、各値が独自のフィールドを保持します。

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

ネストされた値にアクセスするには、ルックアップを連結します:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

内部のハッシュの1つに新しいフィールドを追加する方法も同様です:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

どの階層でキーが欠けているかわからないネストされたハッシュから安全に値を読み取るために、dig はチェーンを辿り、途中で何かが欠けていれば nil を返します:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

チャレンジ

中級

ネストされた inventory ハッシュが与えられています。各トップレベルのキーは部門(department)、各内部キーはアイテム(item)、各内部値は在庫数(整数)です。

1行の入力を読み込みます。これはカンマで区切られた department/item のルックアップパスのリストです。

各パスについて、順番に dig を使用して解決してください。以下のいずれかを出力します:

  • パスが存在する場合は <department>/<item>: <qty>
  • dignil を返した場合は <department>/<item>: missing

すべての行を出力した後、最後にサマリー行を1行出力してください:

Total inventory: <sum>

合計(total)は、元のハッシュ内のすべての部門にわたるすべての数量の合計です。ネストされた反復処理(各部門、次に各アイテム)を使用してください。

入力が fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk の場合、出力は以下のようになります:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

チートシート

ネストされたハッシュは、別のハッシュの中に値としてハッシュを格納します:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

ネストされた値にアクセスするには、ルックアップをチェーンさせます:

students["Alice"][:age]    # 20

ネストされたフィールドを追加または更新するには、代入を行います:

students["Alice"][:major] = "Math"

dig を使用してネストされたキーを安全に探索します。いずれかのキーが見つからない場合は nil を返します:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil

自分で試してみよう

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: 各検索項目について、数量を掘り下げて表示するか、'missing' と表示する。
#       その後、全アイテムの「Total inventory: <合計>」を表示する。
quiz icon腕試し

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

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