Menu
CoddyTech

嵌套哈希

本课属于 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

向其中一个内部哈希添加新字段的方法相同:

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 查询路径列表。

按顺序使用 dig 解析每条路径。打印以下内容之一:

  • 路径存在时,打印 <department>/<item>: <qty>
  • dig 返回 nil 时,打印 <department>/<item>: missing

打印完每一行后,再打印一行汇总:

Total inventory: <sum>

总数是原始哈希中所有部门的每一项库存数量之和。使用嵌套迭代(先遍历每个部门,再遍历每件商品)。

对于输入 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: 对每个查询项,用 dig 查找并打印 qty,找不到就打印 'missing'。
#       然后计算所有物品的总数并打印 'Total inventory: <sum>'。
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Ruby 在线编译器