Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Ruby实例变量对象id很奇怪_Ruby_Metaprogramming_Objectid - Fatal编程技术网

为什么Ruby实例变量对象id很奇怪

为什么Ruby实例变量对象id很奇怪,ruby,metaprogramming,objectid,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 a

下面是测试用例,我只是想用
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
class ObjectIdTest
属性存取器:x,:y
def初始化
@x、 @y=1,2
结束
定义对象标识
“x:{@x.object_id},y:{@y.object_id}”
结束
结束
类ObjectdTestChild
输出: x:4,y:4 z:7

x:4,y:4 z:7

  • 通常情况下,对象ID较长(如70322728590900),为什么它们会如此之小?(他们是亲戚还是类似的?)
  • 为什么xy的对象id相同
  • 为什么oid2oid3的实例变量具有相同的对象id

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

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

    2和3-尽管dup生成对象的浅拷贝,但在这种情况下,该对象恰好表示相同的fixNum。对于Fixnums,相同的数字总是有相同的对象id。

    可能重复:@steenslag我不知道这个问题是否可以算作重复,但因为我不知道Fixnums定义了对象id,所以我找不到答案。(我不能)