-
25-09-2019 - |
题
短版:一类显示器的默认inspect
方法的对象的地址*我怎么能在我自己的
inspect
方法做到这一点
*(要清楚,我要的8位十六进制数字,你通常会从inspect
得到的。我不关心实际的内存地址。我打电话是它的内存地址,因为它的的外观像之一。我知道Ruby是存储器安全的。)
<强>长版本:强>我有两个类,Thing
和ThingList
。 ThingList
是专门设计用来装东西Array
的子类。由于物联网的本质,他们在我的程序中使用的方式,事情已经实例变量@container
指回至持有ThingList
的Thing
。
有可能两个观光具有完全相同的数据。因此,当我调试应用程序,我可以两件事情之间可靠地鉴别的唯一方法是使用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
方法。