diff options
Diffstat (limited to 'lib/weakref.rb')
| -rw-r--r-- | lib/weakref.rb | 68 |
1 files changed, 5 insertions, 63 deletions
diff --git a/lib/weakref.rb b/lib/weakref.rb index dd2cee16aa..c7274f9664 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true require "delegate" # Weak Reference class that allows a referenced object to be @@ -14,55 +15,10 @@ require "delegate" # GC.start # start the garbage collector # p foo.to_s # should raise exception (recycled) # -# == Example -# -# With help from WeakRef, we can implement our own redimentary WeakHash class. -# -# We will call it WeakHash, since it's really just a Hash except all of it's -# keys and values can be garbage collected. -# -# require 'weakref' -# -# class WeakHash < Hash -# def []= key, obj -# super WeakRef.new(key), WeakRef.new(obj) -# end -# end -# -# This is just a simple implementation, we've opened the Hash class and changed -# Hash#store to create a new WeakRef object with +key+ and +obj+ parameters -# before passing them as our key-value pair to the hash. -# -# With this you will have to limit your self to String key's, otherwise you -# will get an ArgumentError because WeakRef cannot create a finalizer for a -# Symbol. Symbols are immutable and cannot be garbage collected. -# -# Let's see it in action: -# -# omg = "lol" -# c = WeakHash.new -# c['foo'] = "bar" -# c['baz'] = Object.new -# c['qux'] = omg -# puts c.inspect -# #=> {"foo"=>"bar", "baz"=>#<Object:0x007f4ddfc6cb48>, "qux"=>"lol"} -# -# # Now run the garbage collector -# GC.start -# c['foo'] #=> nil -# c['baz'] #=> nil -# c['qux'] #=> nil -# omg #=> "lol" -# -# puts c.inspect -# #=> WeakRef::RefError: Invalid Reference - probably recycled -# -# You can see the local variable +omg+ stayed, although it's reference in our -# hash object was garbage collected, along with the rest of the keys and -# values. Also, when we tried to inspect our hash, we got a WeakRef::RefError, -# this is because these objects were also garbage collected. class WeakRef < Delegator + # The version string + VERSION = "0.1.4" ## # RefError is raised when a referenced object has been recycled by the @@ -75,9 +31,6 @@ class WeakRef < Delegator ## # Creates a weak reference to +orig+ - # - # Raises an ArgumentError if the given +orig+ is immutable, such as Symbol, - # Fixnum, or Float. def initialize(orig) case orig @@ -89,7 +42,7 @@ class WeakRef < Delegator super end - def __getobj__ # :nodoc: + def __getobj__(&_block) # :nodoc: @@__map[self] or defined?(@delegate_sd_obj) ? @delegate_sd_obj : Kernel::raise(RefError, "Invalid Reference - probably recycled", Kernel::caller(2)) end @@ -101,17 +54,6 @@ class WeakRef < Delegator # Returns true if the referenced object is still alive. def weakref_alive? - !!(@@__map[self] or defined?(@delegate_sd_obj)) + @@__map.key?(self) or defined?(@delegate_sd_obj) end end - -if __FILE__ == $0 -# require 'thread' - foo = Object.new - p foo.to_s # original's class - foo = WeakRef.new(foo) - p foo.to_s # should be same class - ObjectSpace.garbage_collect - ObjectSpace.garbage_collect - p foo.to_s # should raise exception (recycled) -end |
