gpt4 book ai didi

ruby - Ruby 中的对象地址

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:25 27 4
gpt4 key购买 nike

简短版本:类的默认 inspect 方法显示对象的地址。* 我如何在自定义 inspect 方法中执行此操作我自己的?

*(明确地说,我想要您通常从 inspect 获得的 8 位十六进制数。我不关心实际的内存地址。我只是称它为内存地址,因为它看起来像一个。我知道 Ruby 是内存安全的。)

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

两个事物有可能拥有完全相同的数据。因此,当我调试应用程序时,我能够可靠地区分两个 Thing 的唯一方法是使用 inspect,它会显示它们的地址。然而,当我inspect一个Thing时,我得到一页又一页的输出,因为inspect会递归地检查@container ,导致列表中的每个事物也被检查!

我只需要该输出的第一部分。我如何在 Thing 上编写一个自定义的 inspect 方法来显示它?

#<Thing:0xb7727704>

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

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

最佳答案

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

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

当然,只要你只需要数字是唯一的,不在乎是不是真实地址,*2就可以省略。

* 由于你不需要理解的原因(意思是:我不理解它们),object_id 返回对象内存地址的一半,所以你需要乘以 2 得到实际地址。

关于ruby - Ruby 中的对象地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4010547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com