我可能应该选择使用谷歌的课程,但我找不到答案。
当一个人在类的实例上调用to_s
时,没有祖先,覆盖to_s
,正在调用Object#to_s
,输出如下:
"#<TestClass:0x136e3544>"
默认
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)