加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的对象地址

发布时间:2020-12-17 03:58:14 所属栏目:百科 来源:网络整理
导读:简短版本:类的默认检查方法显示对象的地址.*如何在我自己的自定义检查方法中执行此操作? *(要清楚,我想要通常从检查中得到的8位十六进制数.我不关心实际的内存地址.我只是把它称为内存地址,因为它看起来像一个.我知道Ruby是内存安全的.) 长版:我有两个类,
简短版本:类的默认检查方法显示对象的地址.*如何在我自己的自定义检查方法中执行此操作?

*(要清楚,我想要通常从检查中得到的8位十六进制数.我不关心实际的内存地址.我只是把它称为内存地址,因为它看起来像一个.我知道Ruby是内存安全的.)

长版:我有两个类,Thing和ThingList. ThingList是Array的一个子类,专门用于保存Things.由于Things的性质以及它们在我的程序中的使用方式,Things有一个实例变量@container,它指向持有Thing的ThingList.

两件事可能具有完全相同的数据.因此,当我调试应用程序时,我可以可靠地区分两件事的唯一方法是使用inspect来显示它们的地址.但是当我检查Thing时,我会在输出页面上获取页面,因为inspect将递归检查@container,导致列表中的每个Thing也被检查!

我只需要输出的第一部分.如何在Thing上编写一个自定义检查方法,只显示这个?

#<Thing:0xb7727704>

编辑:我刚刚意识到默认的to_s就是这样做的.我之前没有注意到这一点,因为我有一个自定义to_s,提供有关该对象的人类可读细节.

假设我不能使用to_s,并且我必须编写自定义检查.

解决方法

您可以使用object_id获取地址并将其乘以2 *并使用sprintf(又名%)以十六进制显示:

"#<Thing:0x%08x>" % (object_id * 2)

当然,只要您只需要数字是唯一的并且不关心它是实际地址,您就可以省略* 2.

*由于您不需要理解的原因(意思是:我不理解它们),object_id返回对象内存地址的一半,因此您需要乘以2才能获得实际地址.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读