3

我有这个 Ruby 代码:

var1 = 10
puts var1.object_id
var1 = var1 + 0
puts var1.object_id
var1 = var1 + 1
puts var1.object_id

输出是:

1> 21
2> 21
3> 23

问题:为什么 Ruby 在添加非零值时会创建一个新对象,而在添加 0 时不会?

4

4 回答 4

9

在使用 Fixnums 时,Ruby¹ 内部根本不会创建对象。相反,实现使用“标记”指针,即如果设置了指针的最低有效位,Ruby 理解该指针实际上并不指向对象,而是直接编码 Fixnum 的值。因此,具有相同数值的 Fixnum 将始终由相同的指针值表示。

¹我的意思是官方的 Ruby 解释器——其他实现可能会以不同的方式处理这个问题。

于 2012-12-27T21:40:36.653 回答
5

在 Ruby 中,Fixnums true, falsenilSymbols 具有预定义object_id的 s。

1.object_id #=> 3
2.object_id #=> 5

添加0到一个小整数不会改变它的值,因此它object_id保持不变。

然而,如果你在Bignums 上运行相同的算术,你会得到不同object_id的 s。

a = 1073741824
puts a.object_id # => 7658076
b = a + 0
puts b # => 1073741824
puts b.object_id # => 7287012
于 2012-12-27T21:44:50.623 回答
2

它没有。10并且11是 Fixnums。正弦每个 Integer 值只有一个 Fixnum 实例,10有一个 object_id 和11一个 object_id。这就是你所看到的。

于 2012-12-27T21:39:19.440 回答
2

Ruby 有预定义的对象

irb(main):001:0> 10.object_id
=> 21
irb(main):002:0> 11.object_id
=> 23

这是一些自然数,甚至更多

irb(main):003:0> true.object_id
=> 2
irb(main):004:0> false.object_id
=> 0
irb(main):005:0> nil.object_id
=> 4
irb(main):006:0> 0.object_id
=> 1
irb(main):007:0> -2.object_id
=> -3

并且这些 id 不会改变

于 2012-12-27T21:40:02.627 回答