短版:一类显示器的默认inspect方法的对象的地址*我怎么能在我自己的

自定义inspect方法做到这一点

*(要清楚,我要的8位十六进制数字,你通常会从inspect得到的。我不关心实际的内存地址。我打电话是它的内存地址,因为它的的外观像之一。我知道Ruby是存储器安全的。)

<强>长版本:我有两个类,ThingThingListThingList是专门设计用来装东西Array的子类。由于物联网的本质,他们在我的程序中使用的方式,事情已经实例变量@container指回至持有ThingListThing

有可能两个观光具有完全相同的数据。因此,当我调试应用程序,我可以两件事情之间可靠地鉴别的唯一方法是使用inspect,这显示他们的地址。当我inspect一个Thing,但是,我得到在输出的网页页面,因为inspect将递归检查@container,造成每一件事的清单进行检查,以及!

所有我需要的是,输出的第一部分。我怎么能写上inspect定制Thing方法,将只是显示这个?

#<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是它具有(设计)的存储器安全的语言直接访问内存中没有方法。事实上,在Ruby中的许多实现,对象甚至不的的内存地址。并且在大多数做的实施方式的地图对象直接到存储器,所述存储器地址可能每垃圾回收之后改变。

为什么使用存储器地址作为在MRI和YARV意外工作当前版本的标识符的理由,是因为它们具有糟糕的垃圾收集器实现,它从未进行碎片整理存储器。所有其它实施方式中有垃圾收集器,其整理存储器,并且因此围绕存储器移动对象,从而改变它们的地址。

如果你配合您的实现的内存地址,你的代码将只与蹩脚的垃圾收集慢实现工作。它甚至没有保证MRI和YARV总会有蹩脚的垃圾收集器,事实上,在垃圾收集器已经被认定为的的主要性能瓶颈,一个两个实现,它是安全的假设有是改变到垃圾收集器。已经有在SVN YARV的垃圾收集器,这将是YARV 1.9.3和YARV 2.0的一部分一些重大的改变。

如果你想为对象的ID,使用Object#object_id

而不是继承阵列的类实例可以委托给一个希望的方法,使你不继承重写inspect方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top