stdlib/weakref_lifetime.rb
tests/_examples/stdlib/weakref_lifetime.rb in the metorex repository.
# A WeakRef reaches its object while something else holds it, and raises
# once nothing does. An Integer is never freed, so a reference to one stays.
require "weakref"
held = Object.new
ref = WeakRef.new(held)
p(ref.weakref_alive?)
p(ref.__getobj__.equal?(held))
def make_reference(depth = 10)
depth > 0 ? make_reference(depth - 1) : WeakRef.new(Object.new)
end
references = Array.new(100) { make_reference }
dead = nil
100.times do
GC.start
dead = references.find { |reference| !reference.weakref_alive? }
break if dead
end
p(dead.nil?)
begin
dead.__getobj__
rescue WeakRef::RefError => error
p(error.message)
end
p(WeakRef.new(5).weakref_alive?)
Output:
true
true
false
"Invalid Reference - probably recycled"
true