Ruby 为什么“reduce”不计算单元素数组的块?

Ruby 为什么“reduce”不计算单元素数组的块?,ruby,reduce,Ruby,Reduce,我在试验ruby的reduce方法,这是一个非常好的枚举操作工具 我很难理解为什么当数组包含单个元素时,下面的返回的是字符串而不是整数: ["1", "2"].reduce { |sum, i| sum.to_i + i.to_i } #=> 3 <- expected ["1"].reduce { |sum, i| sum.to_i + i.to_i } #=> "1" <- not expected, expecting it to be 1 我知道在本例中我正在

我在试验ruby的reduce方法,这是一个非常好的枚举操作工具

我很难理解为什么当数组包含单个元素时,下面的返回的是字符串而不是整数:

["1", "2"].reduce { |sum, i| sum.to_i + i.to_i }
#=> 3 <- expected

["1"].reduce { |sum, i| sum.to_i + i.to_i }
#=> "1" <- not expected, expecting it to be 1

我知道在本例中我正在用值0初始化累加器,但我很好奇为什么前一个实现不起作用

嗯,我想我找到了一个解释。reduce似乎不会进入reduce方法中定义的块迭代,因为它已经将第一个元素作为累加器,因此数组为空,不需要进一步的工作,这就是为什么元素将按原样返回


这完全有道理!否则,累加器将被计数两次。

好吧,我相信我已经找到了一个解释。reduce似乎不会进入reduce方法中定义的块迭代,因为它已经将第一个元素作为累加器,因此数组为空,不需要进一步的工作,这就是为什么元素将按原样返回


这完全有道理!否则,累加器将被计数两次。

最后一个有效,因为您给出了一个累加器起始值,然后它开始迭代。如果不给它一个,它将取序列数组的第一个元素(在本例中为可枚举元素),然后它就没有什么可迭代的了,因此永远不会调用该块。

最后一个有效,因为你给了reduce一个累加器起始值,然后它开始迭代。如果你不给它一个,它会取序列数组的第一个元素,在这种情况下,或者任何可枚举的元素,然后它就没有什么可迭代的了,所以块永远不会被调用。

是的,就是这样。确实,你不能对单个元素应用二进制操作。是的,就是这样。确实,不能对单个元素应用二进制操作。我已经简化了您的示例。不需要在块中指定sum。谢谢@Stefan看起来更好:在上一个示例中,将i(即sum+i)转换为_i就足够了–累加器sum已经是数字了。我已经简化了您的示例。不需要在块中指定sum。谢谢@Stefan看起来更好:在上一个示例中,将i(即sum+i)转换为_i就足够了–累加器sum已经是数字了。
["1"].reduce(0) { |sum, i| sum.to_i + i.to_i }
#=> 1