Menu
Coddy logo textTech

ネストしたHash

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

ハッシュの値自体をハッシュにすることができます。このネストされた形は、構造化されたレコードを表すためにRubyコードでよく使われます。つまり、id(または名前)をキーとする1つのハッシュで、各値がそれぞれ独自のフィールドを持ちます。

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

ネストされた値にアクセスするには、検索を連結します。

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

内側のハッシュのいずれかに新しいフィールドを追加する場合も、同じように機能します:

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 ハッシュが与えられます。最上位の各キーは部門を、各内部キーは item を、各内部値は在庫数量(整数)を表します。

入力を1行読み込みます。内容は、カンマ区切りの department/item lookup パスのリストです。

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

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

すべての行を出力した後、要約行を1行追加で出力します。

Total inventory: <sum>

合計は、元のハッシュにあるすべての部門のすべての数量の合計です。ネストされた反復(各部門、次に各 item)を使用してください。

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

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

自分で試してみよう

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

# TODO: 各lookupについて dig し、数量または 'missing' を出力する。
#       Then print 'Total inventory: <sum>' across all items.
quiz icon腕試し

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

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

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