Class WeakRef
In: lib/weakref.rb
Parent: Delegator

WeakRef is a class to represent a reference to an object that is not seen by the tracing phase of the garbage collector. This allows the referenced object to be garbage collected as if nothing is referring to it. Because WeakRef delegates method calls to the referenced object, it may be used in place of that object, i.e. it is of the same duck type.

Usage:

  foo = Object.new
  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
  p foo.to_s                  # should raise exception (recycled)

Methods

Classes and Modules

Class WeakRef::RefError

Public Class methods

Create a new WeakRef from orig.

[Source]

    # File lib/weakref.rb, line 49
49:   def initialize(orig)
50:     super
51:     __setobj__(orig)
52:   end

Public Instance methods

Return the object this WeakRef references. Raises RefError if the object has been garbage collected. The object returned is the object to which method calls are delegated (see Delegator).

[Source]

    # File lib/weakref.rb, line 57
57:   def __getobj__
58:     unless @@id_rev_map[self.__id__] == @__id
59:       raise RefError, "Illegal Reference - probably recycled", caller(2)
60:     end
61:     begin
62:       ObjectSpace._id2ref(@__id)
63:     rescue RangeError
64:       raise RefError, "Illegal Reference - probably recycled", caller(2)
65:     end
66:   end

[Source]

    # File lib/weakref.rb, line 68
68:   def __setobj__(obj)
69:     @__id = obj.__id__
70:     __old_status = Thread.critical
71:     begin
72:       Thread.critical = true
73:       unless @@id_rev_map.key?(self)
74:         ObjectSpace.define_finalizer obj, @@final
75:         ObjectSpace.define_finalizer self, @@final
76:       end
77:       @@id_map[@__id] = [] unless @@id_map[@__id]
78:     ensure
79:       Thread.critical = __old_status
80:     end
81:     @@id_map[@__id].push self.__id__
82:     @@id_rev_map[self.__id__] = @__id
83:   end

Returns true if the referenced object still exists, and false if it has been garbage collected.

[Source]

    # File lib/weakref.rb, line 87
87:   def weakref_alive?
88:     @@id_rev_map[self.__id__] == @__id
89:   end

[Validate]