我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
而以下工作如预期:
["1"].reduce(0) { |sum, i| sum.to_i + i.to_i }
#=> 1
Run Code Online (Sandbox Code Playgroud)
我知道在这种情况下我正在初始化值为0的累加器,但我很好奇为什么前一个实现不起作用!
好吧,我相信我找到了解释.似乎reduce不会进入reduce方法中定义的块迭代,因为它已经将第一个元素作为累加器,因此数组保持为空,并且不需要进一步的工作,这就是元素将按原样返回的原因.
这完全有道理!否则累加器将被计数两次.