代码之家  ›  专栏  ›  技术社区  ›  Exp HP

Ruby中的对象地址

  •  4
  • Exp HP  · 技术社区  · 15 年前

    短版本: inspect 类的方法显示对象的地址。*如何在自定义的 检查

    *(为了清楚起见,我想要一个8位的十六进制数 . 我不在乎实际的内存地址。我叫它记忆地址是因为 就像一个。我知道Ruby是内存安全的。)

    长版本: Thing ThingList . Array @container 它指向 持有 事情 .

    检查 ,显示他们的地址。当我 检查 事情 但是,我得到了一页又一页的输出,因为 将递归检查 @集装箱

    我只需要输出的第一部分。我怎么能写一个习惯 方法打开 事情

    #<Thing:0xb7727704>
    

    编辑: 我刚刚意识到 to_s 就是这样。我之前没注意到因为我有一个习惯 提供有关对象的可读详细信息。

    ,我必须写一个习惯 检查 .

    3 回复  |  直到 12 年前
        1
  •  10
  •   sepp2k    15 年前

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

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

    当然,只要你只需要数字是唯一的,不在乎它是实际地址,你就可以忽略 * 2 .

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

        2
  •  1
  •   Jörg W Mittag    15 年前

    这是不可能的。在Ruby中没有办法获得对象的内存地址,因为Ruby是一种内存安全语言,它(按设计)没有直接访问内存的方法。事实上,在Ruby的许多实现中,对象甚至 存储器地址。在大多数实现中

    在当前版本的MRI和YARV中使用内存地址作为标识符是意外的,原因是它们有一个糟糕的垃圾收集器实现,永远不会对内存进行碎片整理。所有其他实现都有垃圾收集器 对内存进行碎片整理,从而在内存中移动对象,从而更改其地址。

    这个 主要的性能瓶颈,可以肯定的是

    如果需要对象的ID,请使用 Object#object_id .

        3
  •  0
  •   maerics    15 年前

    inspect 方法。