嵌套哈希
本课属于 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挑战
中等给定一个嵌套的 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>'。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器