Ruby 与某些“Bignum”属性混淆

Ruby 与某些“Bignum”属性混淆,ruby,Ruby,从医生那里 我找到了以下属性: “虽然Fixnum值是即时的,Bignum对象不是即时的-赋值和参数传递使用对象引用,而不是对象本身。” 事实上,据我所知,我们正在通过 对对象的引用,而不是对实际对象的引用。但我在这里 我不懂味道 当涉及Bignum对象的计算返回适合Fixnum的结果时,结果将自动转换 在C中,我发现了一些规则,比如自动转换。但是,这里的规则是否也适用于Ruby,或者这里专门为Ruby定义的其他规则 “对于按位操作和[],Bignum被视为具有2的补码表示的无限长位字符串。”

从医生那里

我找到了以下属性:

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

事实上,据我所知,我们正在通过 对对象的引用,而不是对实际对象的引用。但我在这里 我不懂味道

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

C
中,我发现了一些规则,比如自动转换。但是,这里的规则是否也适用于Ruby,或者这里专门为Ruby定义的其他规则

“对于按位操作和[],Bignum被视为具有2的补码表示的无限长位字符串。”

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

有谁能用一些小的代码示例来帮助我详细理解这个主题吗?

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

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

另一方面,Bignum是普通对象。你需要举例说明,你需要参考他们的作品,等等

这意味着当您执行x=5时,对象已经创建。您可以检查原语的对象id,如false或0、1、2、。。。有很多不同的,但总是一样的

> 1.object_id
 => 3
> x = 1
 => 1
> x.object_id
 => 3
这方面有两篇好文章:

对于到Fixnum的转换,当检测到结果在Fixnum覆盖的域中时,会触发显式转换。例如,对于sub-two int,在必要时调用方法bignorm进行转换时(请参阅)

对于你的最后一个问题,它与2的补码表示相关联。有好几篇关于这方面的文章,比如or。事实上,对于Fixnum,按位操作是由处理器直接操作的,并且其操作方式相同

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