与一些’Bignum`属性混淆

来自文件Bignum

我发现以下属性:

“虽然Fixnum值是立即的,但Bignum对象不是 – 赋值和参数传递使用对象的引用,而不是对象本身。”

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

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

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

“对于bitwise运算和[]的目的,Bignum被视为具有2的补码表示的无限长度位bitstring 。”

为什么只有Bignum ,而不是Fixnum或其他任何人?

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

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所涵盖的域中时,会触发显式转换。 例如,对于sub two int,当返回值时,它会调用方法bignorm进行必要的转换(参见上面的注释 )

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

对于你的上一个问题,它与2的补码表示相关联。 有几篇关于它的文章,例如Python的一篇文章或关于按位操作的维基百科页面 。 事实上,对于Fixnum,按位操作由处理器直接操作,并以相同的方式运行。