5

我有许多具有唯一 ID 的 Ruby 对象,我目前正在哈希中缓存这些对象。当一个对象被分配一个 ID 时,它会进入 Hash。缓存是完整的,即存在于 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 回答