【问题标题】:In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives?在 Ruby 中,为什么 inspect() 打印出某种与 object_id() 不同的对象 id?
【发布时间】:2011-02-18 14:27:58
【问题描述】:

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

更新:0x4684abc与36971870不同,后者是0x234255E

>> a = Point.new
=> #<Point:0x4684abc>

>> a.object_id
=> 36971870

>> a.__id__
=> 36971870

>> "%X" % a.object_id
=> "234255E"

【问题讨论】:

    标签: ruby object object-identity


    【解决方案1】:
    0x234255E
    
    =>36971870
    

    不一样,是内存地址的十六进制表示:-)

    【讨论】:

    • 0x4684abc = 2 * 0x234255E,但为什么呢? ))
    • @aaz:因为object_id 将对象的地址向左移动了一位(这与乘以 2 相同)。请参阅我的答案以获取源链接​​。
    【解决方案2】:

    inspect的默认实现调用to_s的默认实现,只是直接显示对象的16进制值,见Object#to_sdocs(点击方法说明可显示出处) )。

    同时,object_id 实现底层的 C 源代码中的 cmets 显示 Ruby 值和对象 ID 有不同的“命名空间”,具体取决于对象的类型(例如,最低位似乎对所有对象都为零但 Fixnums)。您可以在Object#object_iddocs 中看到这一点(点击显示出处)。

    从那里我们可以看到,在“对象 id 空间”(由object_id 返回)中,对象的 id 从右边的第二位开始(第一位为零),但在“值空间”中(由inspect 使用)它们从右侧的第三位开始(前两位为零)。因此,要将值从“对象 id 空间”转换为“值空间”,我们可以将 object_id 向左移动一位,并得到与 inspect 相同的结果:

    > '%x' % (36971870 << 1)
    => "4684abc"
    
    > a = Foo.new
    => #<Foo:0x5cfe4>
    > '%x' % (a.object_id << 1)
    => "5cfe4"
    

    【讨论】:

    • 那些 ruby​​-doc.org 链接现在已经失效:-(
    • @AlexChaffee 我找不到指向方法源的直接链接,用间接链接编辑了帖子。
    猜你喜欢
    • 2020-03-24
    • 2019-04-19
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多