Weak Reference class that allows a referenced object to be
garbage-collected.

A WeakRef may be used exactly like the object it references.

Usage:

foo=Object.new# create a new object instancepfoo.to_s# original's classfoo=WeakRef.new(foo)# reassign foo with WeakRef instancepfoo.to_s# should be same classGC.start# start the garbage collectorpfoo.to_s# should raise exception (recycled)

Example

With help from WeakRef, we can implement our own rudimentary 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.

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 keys, otherwise you
will get an ArgumentError because WeakRef cannot create a finalizer for a
Symbol. Symbols are immutable and cannot be garbage collected.

You can see the local variable omg stayed, although its 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.