Skip to content

Instantly share code, notes, and snippets.

@miloops
Created October 13, 2010 12:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miloops/623971 to your computer and use it in GitHub Desktop.
Save miloops/623971 to your computer and use it in GitHub Desktop.
class WeakHash
def initialize(cache = Hash.new)
@cache = cache
@key_map = {}
@reclaim_key = lambda do |key_id|
delete(@key_map[key_id]) unless @cache.empty?
end
end
def [](key)
value_id = @cache[key]
value_id ? ObjectSpace._id2ref(value_id) : nil
rescue RangeError
nil
end
def []=(key, value)
case key
when Fixnum, Symbol, true, false
key2 = key
else
key2 = key.dup
end
@cache[key2] = value.object_id
@key_map[key.object_id] = key2
ObjectSpace.define_finalizer(key, @reclaim_key)
end
def clear
@key_map.clear
@cache.clear
end
def delete(key)
@cache.delete(key)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment