为什么输出相同?
首先注入:
puts (3...10).inject(0) { |sum, x| (x % 3 == 0 || x % 5 == 0) ? sum + x : sum }
# => 23
第二次注射:
puts (3...10).inject { |sum, x| (x % 3 == 0 || x % 5 == 0) ? sum + x : sum }
# => 23
# Why not 26?
我认为如果没有传递参数,则inject使用集合的第一个元素作为初始值。
所以第二次注入应返回与此值相同的值:
puts (3...10).inject(3) { |sum, x| (x % 3 == 0 || x % 5 == 0) ? sum + x : sum }
# => 26
答案 0 :(得分:5)
为什么这两个注入在ruby中提供相同的输出?
......因为他们应该这样做。它们仅因添加0
而有所不同。
我认为如果没有传递参数,则inject使用集合的第一个元素作为初始值。
确实如此。但它并没有复制它。
您的第一个示例会收到以下数字:
0, 3, 4, 5, 6, 7, 8, 9
你的第二个例子收到这些数字:
3, 4, 5, 6, ...
将0
添加到开头并不会影响结果,它们是23,而不是26,因为你声称。
您的第3个示例返回26,因为它收到这些数字:
3, 3, 4, 5, 6, ...
答案 1 :(得分:0)
#inject() with an argument:
result = (3...10).inject(0) do |sum, x|
puts "#{sum} <-- #{x}: sum = #{sum+x}"
sum + x
end
--output:--
0 <-- 3: sum = 3
3 <-- 4: sum = 7
7 <-- 5: sum = 12
12 <-- 6: sum = 18
18 <-- 7: sum = 25
25 <-- 8: sum = 33
33 <-- 9: sum = 42
...
#inject without an argument:
result = (3...10).inject() do |sum, x|
puts "#{sum} <-- #{x}: sum = #{sum+x}"
sum + x
end
--output:--
3 <-- 4: sum = 7
7 <-- 5: sum = 12
12 <-- 6: sum = 18
18 <-- 7: sum = 25
25 <-- 8: sum = 33
33 <-- 9: sum = 42
我一直认为它需要集合的第一个元素 初始值并仍然执行第一次迭代
第一次迭代使用arr [0]作为和,arr [1]作为第一次x。当你没有为inject()提供一个参数时,它等同于这样做:
data = (3...10).to_a
initial_sum = data.shift
data.inject(initial_sum) do |sum, x|
puts "#{sum} <-- #{x}: sum = #{sum+x}"
sum + x
end
--output:--
3 <-- 4: sum = 7
7 <-- 5: sum = 12
12 <-- 6: sum = 18
18 <-- 7: sum = 25
25 <-- 8: sum = 33
33 <-- 9: sum = 42