1

我对所有 ruby​​ 对象中存在的一种先天方法的工作感到困惑,即 object_id 方法。当我一次又一次地在任何 Fixnum 对象上运行 object_id 方法时,例如在 irb 中,如果我这样做,

>>100.object_id
=>201

再做一次,

>>100.object_id
=>201

但是,例如,当我使用 String 对象时

>>“你好”.object_id
=>162333336

再做一次,

>>“你好”.object_id
=>15502236

为什么这样?在 ruby​​ 中,一切都是对象,每个对象都有一个名为 object_id 的固有方法,该方法唯一地标识该对象。但是在这里,ruby 让我感到困惑,因为它将具有相同文本(即“Hello”)的两个字符串视为不同,但具有相同值(即 100)的两个 Fixnum 对象相同,并为它们提供相同的对象 ID。为什么这样?谁能帮帮我吗?

4

3 回答 3

5

Fixnums 是 Ruby 中的不可变对象。只创建了一个实例,您可以“直接”使用该对象。ie 不像其他常规对象那样使用引用。所以他们有一个固定的object_id。这没关系,因为您只有一个对象实例。

但是当你写“hello”时,会创建一个新的字符串对象。在同一个脚本中,如果你再给一个“你好”,即使它们有相同的内容,也会创建一个新对象。因此不同的object_ids。

于 2012-11-08T07:22:55.930 回答
1

这种行为是 Ruby 实现的问题,而不是规范问题。最有可能的是,您正在使用 MRI(从 C 源代码编译),在 JRuby 中您可以获得不同的结果。

出于性能目的,MRI 特别处理truefalse、和。几个链接,您可以在其中找到有关它的更多信息:http ://www.oreillynet.com/ruby/blog/2006/02/ruby_values_and_object_ids.html,http : //rhg.rubyforge.org/chapter02.htmlnilFixnumsymbol

于 2012-11-08T07:30:32.250 回答
0

如果您想获得相同的字符串对象 ID,则必须先将其转换为符号,然后您的 object_id 保持不变

'Hello'.to_sym.object_id
于 2013-01-09T19:28:49.627 回答