推荐答案
# 使用 inject/reduce 方法计算数组中所有元素的和
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) { |result, element| result + element }
puts sum # 输出: 15
# 使用 inject/reduce 方法计算数组中所有元素的乘积
product = numbers.inject(1) { |result, element| result * element }
puts product # 输出: 120本题详细解读
1. inject 和 reduce 方法的基本概念
inject 和 reduce 是 Ruby 中用于累积操作的方法,它们的功能完全相同,只是名称不同。这两个方法通常用于对集合(如数组)中的元素进行累积操作,例如求和、求积、拼接字符串等。
2. 方法签名
inject(initial) { |memo, obj| block } → obj
reduce(initial) { |memo, obj| block } → objinitial:累积操作的初始值。memo:累积器,用于保存中间结果。obj:当前迭代的元素。block:对每个元素执行的操作。
3. 使用示例
3.1 求和
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) { |result, element| result + element }
puts sum # 输出: 15在这个例子中,inject 方法从初始值 0 开始,依次将数组中的每个元素加到 result 上,最终返回累积的结果。
3.2 求积
product = numbers.inject(1) { |result, element| result * element }
puts product # 输出: 120在这个例子中,inject 方法从初始值 1 开始,依次将数组中的每个元素乘到 result 上,最终返回累积的结果。
4. 省略初始值
如果省略初始值,inject 和 reduce 会将数组的第一个元素作为初始值,并从第二个元素开始迭代。
sum = numbers.inject { |result, element| result + element }
puts sum # 输出: 155. 符号作为块
inject 和 reduce 还可以接受一个符号作为块,表示要执行的操作。
sum = numbers.inject(:+) puts sum # 输出: 15 product = numbers.inject(:*) puts product # 输出: 120
这种方式更加简洁,适用于简单的累积操作。