class Universa::WeakReference
The smarter and safer weak reference than a standard one. It keeps object_id even if it is GC'd and can create a hard reference when possible. Some code borrowed from github.com/ruby-concurrency/ref.
Note there is no alive?
method because it is not thread safe. Use the safe approach:
weak = WeakReference.new(something) hard = weak.get if hard # we got safe reference in +hard+ end
or, scala/kotlin-style:
weak.let { |object| object.do_somethinf }
Attributes
referenced_object_id[R]
ruby object it of the referenced object. Available also after object is recycled.
Public Class Methods
new(object)
click to toggle source
Create weak reference for a given object
# File lib/universa/weak_reference.rb, line 29 def initialize(object) @referenced_object_id = object.__id__ @weakref = WeakRef.new(object) end
Public Instance Methods
get()
click to toggle source
Get the strong reference unless it is already reclaimed.
@return [Object] har reference to the source object or nil
# File lib/universa/weak_reference.rb, line 49 def get @weakref.__getobj__ rescue => e # Jruby implementation uses RefError while MRI uses WeakRef::RefError if (defined?(RefError) && e.is_a?(RefError)) || (defined?(::WeakRef::RefError) && e.is_a?(::WeakRef::RefError)) nil else raise e end end
let() { |hardref| ... }
click to toggle source
Call the block passing it hard ref to the object if it is not yet recycled
@return what the block returned or nil @yield object if it is not recycled
# File lib/universa/weak_reference.rb, line 38 def let if (hardref = object.get) yield hardref else nil end end