stdlib/weakref_lifetime_no_parens.rb
tests/_examples/stdlib/weakref_lifetime_no_parens.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
return WeakRef.new Object.new if depth.zero?
make_reference depth - 1
end
references = Array.new 100 do
make_reference
end
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
number = WeakRef.new 5
p number.weakref_alive?
Output:
true
true
false
"Invalid Reference - probably recycled"
true