Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 覆盖Fixnum中的方法以处理Bignum_Ruby - Fatal编程技术网

Ruby 覆盖Fixnum中的方法以处理Bignum

Ruby 覆盖Fixnum中的方法以处理Bignum,ruby,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 e

下面是一个规范,我应该通过在
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
问题是,
1000\u 000\u 000\u 000
不被视为
Fixnum
,而是
Bignum

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

我是否遗漏了作业的要点,或者有没有办法强迫
Fixnum
处理这么大的数字


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


如果这就是您正在使用的,您需要修改
Integer
Bignum

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


如果这就是您正在使用的,您需要修改
Integer
Bignum

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

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


对于
Fixnum
Bignum
都有一个抽象基类,称为
Integer
,您应该(几乎)经常使用它。

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

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


Fixnum
Bignum
都有一个抽象基类,称为
Integer
,您应该(几乎)经常使用它。

FYI:Integer是两个包含整数的具体类的基础,Bignum和Fixnum:-)谢谢-这在现实世界中肯定会有帮助,但这似乎也是欺骗,因为我被告知只修改Fixnum。如果你有一个
Bignum
,你可以覆盖
Fixnum
中你想要的任何方法,该
Bignum
不会改变@Stefan是对的,明智的做法是在
Integer
@dwilbank中实现您的方法,您确定吗
1_000_000_000_000.class#=>Fixnum
我的irb说它是Bignum-attaching照片,如果我可以的话…仅供参考:Integer是两个具体的包含整数的类的基础,Bignum和Fixnum:-)谢谢-这在现实世界中肯定会有帮助,但这似乎也是作弊,因为我被告知只修改Fixnum。如果你有一个
Bignum
,你可以在
Fixnum
中覆盖你想要的任何方法,该
Bignum
不会有任何改变@Stefan是对的,明智的做法是在
Integer
@dwilbank中实现您的方法,您确定吗<代码>1_000_000_000_000.class#=>Fixnum我的irb说如果可以的话它是Bignum-attaching照片…所以我的电脑是64位的,但我的ruby安装可能不是?我可以发誓我安装了正确的版本…所以我键入了['foo'].pack('p')。要检查大小,我得到了“4”,这意味着我是32位的。谢谢将重新安装。所以我的电脑是64位的,但我的ruby安装可能不是?我可以发誓我安装了正确的版本…所以我键入了['foo'].pack('p')。要检查大小,我得到了“4”,这意味着我是32位的。谢谢将重新安装。yeh-我的64位ruby安装仍然获得Bignum-切换到Integer…yeh-我的64位ruby安装仍然获得Bignum-切换到Integer。。。