与一些'Bignum`属性混淆

时间:2013-03-07 06:33:09

标签: ruby

来自文档Bignum

我发现以下属性:

  

“虽然Fixnum值是立即的,但Bignum个对象不是 - 赋值和参数传递与对象的引用一起工作,而不是对象本身。”

实际上据我所知,我们正在过世    对象的引用,而不是实际的对象。但在这里我    无法追随品味。

  

“当涉及Bignum个对象的计算返回适合Fixnum的结果时,结果会自动转换。”

C我发现了一些自动转换的规则。但这里是否同样适用于此处或此处为Ruby特别定义的其他规则?

  

“出于bitwise操作和[]的目的,Bignum被视为具有2的补码表示的无限长bitstring。”

为什么仅Bignum,而不是Fixnum或其他?

有没有人可以通过一些微小的代码示例帮助我详细了解这个主题?

1 个答案:

答案 0 :(得分:0)

Fixnum是已经实例化的不可变对象。你只需要使用它们。根据文件:

  

Fixnum对象具有直接价值。这意味着当它们作为参数分配或传递时,将传递实际对象,而不是对该对象的引用。赋值不会为Fixnum对象添加别名。对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单例方法添加到Fixnum。

另一方面,Bignum是正常的对象。您需要实例化它们,使用它们的参考等等。

这意味着当你做x = 5时,对象已经被创建了。您可以检查基元的object_id,例如false或0,1,2,......有所有不同,但始终相同。

> 1.object_id
 => 3
> x = 1
 => 1
> x.object_id
 => 3

关于该主题的两篇好文章:

对于转换为Fixnum,当检测到结果位于Fixnum所涵盖的域中时,会触发显式转换。例如,对于子二个整数,当returning the value时,它会调用方法bignorm进行必要的转换(请参阅comment above

> a = 10000000000
 => 10000000000 
> a.class
 => Bignum 
> b = a / 10
 => 1000000000 
> b.class
 => Fixnum 

对于你的上一个问题,它与2的补码表示相关联。有几篇关于此的文章,例如the one for Pythonthe wikipedia page about bitwise operation。事实上,对于Fixnum,按位操作由处理器直接操作,并以相同的方式运行。