为什么这些方法为同一操作返回有理数和整数



我一直在试图弄清楚为什么一种方法返回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

最新更新