Menu
CoddyTech

遍历哈希

本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 34 课,共 56 课。

哈希是可枚举的,因此你可以像遍历数组一样遍历它们。根据你的需求,常见的模式有三种。

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 }   # 苹果、面包、牛奶

each_value 只遍历值:

prices.each_value { |v| puts v }   # 1, 3, 4

上一章中你学过的每个 Enumerable 方法,map、select、reduce,也都适用于哈希。每次循环时,你只会收到一个键值对(或一个包含 2 个元素的数组):

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

挑战

中等

你要给价格列表打折。给定哈希 prices(商品符号 => 整数价格)。

读取一行输入:一个逗号分隔的列表,其中包含要打 5 折的商品(按名称匹配哈希中的符号)。

按以下顺序输出:

  1. 每件商品占一行,格式为 <item>: $<final_price>。如果商品在折扣列表中,最终价格就是折后价格;否则就是原价。使用 each 迭代。商品保持原有顺序。折扣价格使用整数除法计算(price / 2)。
  2. Was: $<n>:原始总价(使用 values.sum)
  3. Now: $<n>:折扣后的总价
  4. 最终价格仍高于 2 的商品名称,用 , 连接(在新哈希上使用 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 构建最终价格哈希;打印每项价格、总价和高价商品
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Ruby 在线编译器