为什么这两个注入在ruby中提供相同的输出?

时间:2014-08-13 19:05:09

标签: ruby inject

为什么输出相同?

首先注入:

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

2 个答案:

答案 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