Exp*_* HP 4 ruby debugging memory-address inspect
简短版本:类 的默认inspect方法显示对象的地址.*如何在inspect我自己的自定义方法中执行此操作?
*(要清楚,我想要你通常会得到的8位十六进制数inspect.我不关心实际的内存地址.我只是把它称为内存地址,因为它看起来像一个.我知道Ruby是存储安全.)
长版: 我有两个课,Thing和ThingList. ThingList是一个Array专门设计用于保存物品的子类.由于事物的本质以及它们在我的程序中使用的方式,事物有一个实例变量@container,指向ThingList那个持有的东西Thing.
两件事可能具有完全相同的数据.因此,当我调试应用程序时,我可以可靠地区分两件事的唯一方法是使用inspect,它显示他们的地址.当我inspect一个Thing,不过,我得在输出的页面,因为页面inspect会递归的检查@container,造成每一件事的清单进行检查,以及!
我只需要输出的第一部分.如何编写自定义inspect方法Thing才会显示此内容?
#<Thing:0xb7727704>
Run Code Online (Sandbox Code Playgroud)
编辑: 我刚刚意识到默认就是to_s这样.我之前没有注意到这一点,因为我有一个自定义to_s提供有关该对象的人类可读细节.
假设我不能使用to_s,我必须写一个自定义inspect.
sep*_*p2k 10
您可以使用object_id获取地址并将其乘以2 * 并使用sprintf(aka %)以十六进制显示:
"#<Thing:0x%08x>" % (object_id * 2)
Run Code Online (Sandbox Code Playgroud)
当然,只要您只需要数字是唯一的并且不关心它是实际地址,您就可以省略* 2.
*由于您不需要理解的原因(意思是:我不理解它们),object_id返回对象的内存地址的一半,因此您需要乘以2才能获得实际地址.