这是我应该通过在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
处理这么大的数字?
答案 0 :(得分:2)
您需要一个64位处理器才能在Fixnum
中使用它。在32位处理器上,超过0x7FFFFFFF(约2亿)的所有内容都将是Bignum。
如果您正在使用此功能,则需要修改Integer
或Bignum
。
答案 1 :(得分:2)
这是不可能的。 Ruby语言规范中没有任何内容可以保证某个整数适合或不适合Fixnum
。这完全取决于实现。在YARV上,Fixnum
是31位或63位,具体取决于处理器ISA。在JRuby上,它们总是64位。在其他实现中,它们可能更大或更小,甚至两者都有,具体取决于环境。
在我个人看来:Fixnum
是性能优化。它们不应该暴露给程序员 。
Fixnum
和Bignum
都有一个名为Integer
的抽象基类,你应该(几乎)总是使用它。