覆盖Fixnum中的一个方法来处理Bignum

时间:2013-10-09 15:51:23

标签: ruby

这是我应该通过在Fixnum中创建新方法来实现的规范:

it "reads trillions" do
    1_000_000_000_000.in_words.should == 'one trillion'
    1_000_000_000_001.in_words.should == 'one trillion one'
    1_888_259_040_036.in_words.should == 'one trillion eight hundred eighty eight billion two hundred fifty nine million forty thousand thirty six'
  end

问题是,1_000_000_000_000不被视为Fixnum,而是Bignum

我的第一个想法是继续将新方法添加到Bignum

我是否错过了作业的重点,或者是否有办法迫使Fixnum处理这么大的数字?

enter image description here

2 个答案:

答案 0 :(得分:2)

您需要一个64位处理器才能在Fixnum中使用它。在32位处理器上,超过0x7FFFFFFF(约2亿)的所有内容都将是Bignum。

如果您正在使用此功能,则需要修改IntegerBignum

答案 1 :(得分:2)

这是不可能的。 Ruby语言规范中没有任何内容可以保证某个整数适合或不适合Fixnum。这完全取决于实现。在YARV上,Fixnum是31位或63位,具体取决于处理器ISA。在JRuby上,它们总是64位。在其他实现中,它们可能更大或更小,甚至两者都有,具体取决于环境。

在我个人看来:Fixnum是性能优化。它们不应该暴露给程序员

FixnumBignum都有一个名为Integer的抽象基类,你应该(几乎)总是使用它。