我一直在试图弄清楚为什么一种方法返回Rational
而另一种处理相同操作的方法返回Integer
。
我最好的猜测是Ruby无法从Fixnum切换到Bignum!?
(1..64).to_a.map.with_index { |_v, i| 2**(i - 1) }.sum.class #Rational
(1..64).inject { |total,n| total + 2**(n-1)}.class #Integer
我本来希望这两种方法都返回一个整数。如果有人问,我正在使用inject
版本...
默认情况下,方法 with_index 的第一个索引为 0。因此,您的函数会产生不同的值。例如,检查在第一个函数上生成的第一个值:
2**(i - 1) = 2 ** -1 = 1/2
注意到这里的理性了吗?
这会影响整体数学,使两个值彼此不同。
您需要将参数"1"传递给with_index。
(1..64).to_a.map.with_index(1) { |_v, i| 2**(i - 1) }.sum == (1..64).inject { |total,n| total + 2**(n-1)}
=> true