Menu
CoddyTech

Reduce / Inject

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

有时你需要将整个数组归约为一个值,比如总和、乘积或最长字符串。reduce(也称为 inject:同一个方法有两个名称)就是实现这一点的工具。

这个代码块接受两个参数:累加器和当前元素。代码块的返回值会成为下一个累加器。

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total   # 10

累加器的值逐步变化为 0 → 1 → 3 → 6 → 10。

第一个参数是累加器的初始值。如果不提供,Ruby 会使用数组的第一个元素:

[1, 2, 3, 4].reduce { |acc, n| acc * n }   # 24

对于求和、求积这类简单运算,Ruby 提供了一种快捷写法:传入一个符号,而不是代码块:

[1, 2, 3, 4].reduce(:+)   # 10
[1, 2, 3, 4].reduce(:*)   # 24

掌握如何构建自定义累加器后,你几乎可以通过一次遍历计算任何内容。

challenge icon

挑战

简单

读取一个以逗号分隔的整数列表。打印三行:

  1. 总和(使用 reduce(:+))
  2. 乘积(使用 reduce(:*))
  3. 最大值,使用 reduce 和显式代码块计算,不要使用 max。

输入 2,5,3,8 时,输出为:

18
240
8

亲手试试

numbers = gets.chomp.split(",").map(&:to_i)

# TODO:输出总和、乘积和最大值(使用 reduce + 显式代码块)
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Ruby 在线编译器