0

自己統合失調症に苦しむコードを見ています。1 つのオブジェクトが別のオブジェクトをラップしていますが、これはプログラマーには隠され、コードはラッパーとラップされたオブジェクトの ID が同じであると想定します。これは object_id にのみ関連し、比較を含むメソッド呼び出しには関連しません。ラッパーがラップされたものと同じ object_id を与える場合、VM に問題があることはわかっていますが、正しく動作するために object_id に依存するカーネル、クラス、モジュール メソッド (または他の一般的に使用されるメソッド) はありますか?

例では

次のようなコードがあるかもしれません

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

add の呼び出しが false を返すと予想すると、同じオブジェクトを実際に 2 回追加できることに驚かれることでしょう (ラッパーについては知りません)。

質問を言い換えると、正しく動作するために 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 に答える