1

来自文档Bignum

我发现以下属性:

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

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

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

C我发现了一些规则,比如自动转换。但是同样适用于这里还是这里专门为 Ruby 定义的其他规则?

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

为什么Bignum只有,没有Fixnum或任何其他?

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

4

1 回答 1

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覆盖的域时,会触发显式转换。例如,对于子两个整数,当返回值时,它会在必要时调用方法 bignorm 进行转换(请参阅上面的注释

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

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

于 2013-03-07T10:55:01.327 回答