0

下面是测试用例,我只是想用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. 为什么xy的对象 id 相同?
  3. 为什么oid2oid3的实例变量具有相同的对象 id?
4

1 回答 1

1

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

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

2 和 3 - 虽然dup会生成对象的浅表副本,但在这种情况下,该对象恰好代表相同的 Fixnums。对于 Fixnums,相同的数字始终具有相同的 object_id。 红宝石对象

于 2013-02-23T21:34:38.060 回答