0

我正在看一段患有自我精神分裂症的代码。一个对象正在包装另一个对象,对程序员来说这是隐藏的,代码将期望包装器和被包装器的身份相同。这仅与 object_id 相关,与包括比较在内的任何方法调用无关。我知道如果包装器会给出与被包装器相同的 object_id,但是否有任何依赖 object_id 正常运行的内核、类、模块方法(或其他常用方法),VM 会出现问题?

在示例中

我可能有类似的代码

class HashSet
  def add(x)
     if @objects.has_key? x.object_id
       false
     else
       @objects[x.object_id] = x
     end 
  end
end

如果我希望 add 调用返回 false 我会惊讶地发现我实际上可以添加两次相同的对象(我不知道包装器)。

重申这个问题:是否有任何依赖 object_id 来正确运行的内核、类、模块方法(或其他常用方法)?

4

1 回答 1

2

哈希实例具有compare_by_identity模式:

a1 = "a"
a2 = "a"
p a1.object_id == a2.object_id #=>false
h = {}
h.compare_by_identity
h[a1] = 0
h[a2] = 1

p h # => {"a"=>0, "a"=>1}
p h["a"] # => nil
p h[a2] # => 1
于 2013-09-11T11:42:36.753 回答