5

現在ハッシュにキャッシュしている一意の ID を持つ Ruby オブジェクトが多数あります。オブジェクトに ID が割り当てられると、ハッシュに入ります。つまり、Ruby スコープに存在する ID を持つすべてのオブジェクトもキャッシュにあるはずです。

ただし、他のすべてのスコープからオブジェクトが消えたら、オブジェクトをキャッシュから削除する方法を見つけるのに苦労しています。これはもちろん、キャッシュに含まれるオブジェクトがガベージ コレクションされないためです。

この問題へのアプローチはありますか?のドキュメントはクラスをWeakRef提案してWeakHashいますが、実際の使用には受け入れられないようですが、プロジェクトに必要だと思うものに非常に近いです。

4

1 に答える 1

3

WeakHashに似た何かがそれを行います。Fixnums、Symbols、Floats(およびそれらをリストに追加した場合は他の不変タイプ)を処理できる、より完全な実装を次に示します。

class WeakHash < Hash
  def []=(k, v)
    if(![Fixnum, Symbol, Float].include? k.class)
      k = WeakRef.new(k)
    end
    if(![Fixnum, Symbol, Float].include? v.class)
      v = WeakRef.new(v)
    end
    super k,v
  end
end
于 2013-03-11T02:09:56.430 に答える