遍历哈希
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 34 课,共 56 课。
哈希是可枚举的,因此你可以像遍历数组一样遍历它们。根据你的需求,常见的模式有三种。
each 会同时提供键和值:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_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}挑战
中等你要给价格列表打折。给定哈希 prices(商品符号 => 整数价格)。
读取一行输入:一个逗号分隔的列表,其中包含要打 5 折的商品(按名称匹配哈希中的符号)。
按以下顺序输出:
- 每件商品占一行,格式为
<item>: $<final_price>。如果商品在折扣列表中,最终价格就是折后价格;否则就是原价。使用each迭代。商品保持原有顺序。折扣价格使用整数除法计算(price / 2)。 Was: $<n>:原始总价(使用values.sum)Now: $<n>:折扣后的总价- 最终价格仍高于
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 构建最终价格哈希;打印每项价格、总价和高价商品
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器