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掌握如何构建自定义累加器后,你几乎可以通过一次遍历计算任何内容。
挑战
简单读取一个以逗号分隔的整数列表。打印三行:
- 总和(使用
reduce(:+)) - 乘积(使用
reduce(:*)) - 最大值,使用
reduce和显式代码块计算,不要使用max。
输入 2,5,3,8 时,输出为:
18
240
8亲手试试
numbers = gets.chomp.split(",").map(&:to_i)
# TODO:输出总和、乘积和最大值(使用 reduce + 显式代码块)
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
5Enumerable 的强大功能
Select 与 Reject链式调用 MapReduce / Injectcount、all?、any?、none?group_by 与 partitionsort_by、min_by、max_by回顾:数据管道自己练习: Ruby 在线编译器