代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

在Ruby中,为什么inspect()会打印出一种不同于object_id()给出的对象ID?

  •  30
  • nonopolarity  · 技术社区  · 14 年前

    p 函数用于打印一个对象,它可以给出一个ID,它与 object_id() 给予。不同数字的原因是什么?

    更新: 0x4684abc 不同于 36971870 ,这就是 0x234255E

    >> a = Point.new
    => #<Point:0x4684abc>
    
    >> a.object_id
    => 36971870
    
    >> a.__id__
    => 36971870
    
    >> "%X" % a.object_id
    => "234255E"
    
    2 回复  |  直到 10 年前
        1
  •  49
  •   KL-7    12 年前

    默认实现 inspect 调用的默认实现 to_s ,它直接显示对象的十六进制值,如 Object#to_s docs (单击方法说明以显示源)。

    同时,在C源中对实施 object_id 显示Ruby值和对象ID有不同的名称空间,这取决于对象的类型(例如,除了FixNum之外,所有对象的最低位似乎都为零)。你可以在里面看到 Object#object_id docs (单击以显示源)。

    从那里我们可以看到在对象ID空间(返回 对象编号 )对象的ID从右边的第二个位开始(第一个位为零),但以__value space__开始(由 检查 )它们从右边的第三个位开始(前两个位为零)。因此,要将__object id space_的值转换为__value space__的值,我们可以将 对象编号 向左一位,得到的结果与 检查 :

    > '%x' % (36971870 << 1)
    => "4684abc"
    
    > a = Foo.new
    => #<Foo:0x5cfe4>
    > '%x' % (a.object_id << 1)
    => "5cfe4"
    
        2
  •  1
  •   Robbie    14 年前
    0x234255E
    
    =>36971870
    

    它不是不同的,它是内存地址的十六进制表示形式:—)