Object#to_s vs __id__ aka object_id

时间:2015-05-22 11:32:00

标签: ruby objectid

我可能应该选择使用谷歌的课程,但我找不到答案。

当一个人在类的实例上调用to_s时,没有祖先,覆盖to_s,正在调用Object#to_s,输出如下:

"#<TestClass:0x136e3544>"

根据documentation

  

默认to_s打印对象的类,打印对象ID

这里的“编码”意味着什么?这不是id本身:

▶ t = TestClass.new.to_s
#⇒ "#<TestClass:0x137e6b94>"
▶ t.__id__
#⇒ 163526070
▶ "0x%08x" % t.__id__
#⇒ "0x09bf35b6"

根据ruby源代码,它是一个堆内存地址:

str = rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)obj);

现在的问题是:__id__与默认to_s中的内容之间是否存在任何关系?

NB 对@MarekLipka的信用:可能此行为可能仅在VirtualBox下重现。听起来像在原生环境中,以下是诀窍:

"0x%08x" % (t.__id__ << 1)

0 个答案:

没有答案