合并与转换
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 36 课,共 56 课。
使用哈希时,有两种操作非常常见,因此 Ruby 为它们提供了专用方法。
merge 会将两个哈希合并为一个新哈希。如果它们有相同的键,则采用右侧的值:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}两个原始哈希表都不会被修改,merge 会返回一个新的哈希表。
transform_values 会生成一个新的哈希,键保持不变,但每个值都会经过一个代码块处理:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}而 transform_keys 对键执行相同的操作,在将字符串转换为符号或统一大小写时很有用:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}挑战
中等给定两个购物车哈希:monday 和 tuesday,每个哈希都将字符串商品名称映射到整数数量。商店需要计算两天的标准化总量。
按以下步骤生成一个最终哈希:
- 使用一个代码块将两个哈希进行
merge,使两个哈希中都存在的键对应的数量相加(而不是覆盖) - 对结果调用
transform_keys(&:to_sym),将键转换为符号 - 调用
transform_values应用 10% 的批量折扣:使用整数运算将每个数量转换为(qty * 9 / 10)
使用 inspect 打印最终哈希。
使用默认数据时,输出为:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(苹果:5 + 5 = 10,然后得到 9。面包:3 + 2 = 5,然后得到 4。牛奶:只在星期一有 6 个,之后得到 5。奶酪:只在星期二有 2 个,之后得到 1。)
亲手试试
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO:用 merge-with-block 将相同键对应的值相加,然后将键转为符号,
# 再对每个值执行 * 9 / 10,最后查看结果
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器