Menu
CoddyTech

合并与转换

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

挑战

中等

给定两个购物车哈希:monday 和 tuesday,每个哈希都将字符串商品名称映射到整数数量。商店需要计算两天的标准化总量。

按以下步骤生成一个最终哈希:

  1. 使用一个代码块将两个哈希进行 merge,使两个哈希中都存在的键对应的数量相加(而不是覆盖)
  2. 对结果调用 transform_keys(&:to_sym),将键转换为符号
  3. 调用 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,最后查看结果
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Ruby 在线编译器