为什么Ruby实例变量object_id s很奇怪

时间:2013-02-23 21:22:05

标签: ruby metaprogramming objectid

以下是测试用例,我只想尝试使用dup方法。但我意识到这种奇怪的行为。我找不到任何合理的解释。

class ObjectIdTest
  attr_accessor :x, :y
  def initialize
    @x, @y = 1, 2
  end

  def object_ids
    "x:#{@x.object_id}, y: #{@y.object_id}"
  end
end

class ObjectIdTestChild < ObjectIdTest
  attr_accessor :z
  def initialize
    @z = 3
  end

  def object_ids
    super + " z: #{@z.object_id}"
  end
end

oid1 = ObjectIdTest.new
oid2 = ObjectIdTestChild.new
p oid2.object_ids

oid3 = oid2.dup
p oid3.object_ids

输出: “x:4,y:4 z:7”

“x:4,y:4 z:7”

  1. 通常对象ID更长(如 70322728590900 ),为什么这些更小? (他们是亲戚还是类似的东西?)
  2. 为什么 x y 的对象ID相同?
  3. 为什么 oid2 oid3 的实例变量具有相同的对象ID?

1 个答案:

答案 0 :(得分:1)

1 - Fixnumber以外的对象具有更大的值。例如:

 "hello".object_id #=> 70256148388440
 0x3FFFFFFFF.object_id #=> 34359738367

2和3 - Althought dup生成一个对象的浅表副本,在这种情况下,该对象碰巧代表相同的Fixnums。使用Fixnums,相同的数字始终具有相同的object_id。 Ruby Object