来自文档Bignum
我发现以下属性:
“虽然
Fixnum
值是立即的,但Bignum
个对象不是 - 赋值和参数传递与对象的引用一起工作,而不是对象本身。”
实际上据我所知,我们正在过世 对象的引用,而不是实际的对象。但在这里我 无法追随品味。
“当涉及
Bignum
个对象的计算返回适合Fixnum
的结果时,结果会自动转换。”
在C
我发现了一些自动转换的规则。但这里是否同样适用于此处或此处为Ruby特别定义的其他规则?
“出于
bitwise
操作和[]
的目的,Bignum被视为具有2的补码表示的无限长bitstring
。”
为什么仅Bignum
,而不是Fixnum
或其他?
有没有人可以通过一些微小的代码示例帮助我详细了解这个主题?
答案 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 Python或the wikipedia page about bitwise operation。事实上,对于Fixnum,按位操作由处理器直接操作,并以相同的方式运行。