[前][次][番号順一覧][スレッド一覧]

ruby-changes:26082

From: zzak <ko1@a...>
Date: Sun, 2 Dec 2012 16:48:53 +0900 (JST)
Subject: [ruby-changes:26082] zzak:r38139 (trunk): * lib/weakref.rb (rdoc): Clean up usage, add example,

zzak	2012-12-02 16:48:42 +0900 (Sun, 02 Dec 2012)

  New Revision: 38139

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=38139

  Log:
    * lib/weakref.rb (rdoc): Clean up usage, add example,
      note ArgumentError on WeakRef.new

  Modified files:
    trunk/ChangeLog
    trunk/lib/weakref.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38138)
+++ ChangeLog	(revision 38139)
@@ -1,3 +1,8 @@
+Sun Dec  2 16:48:00 2012  Zachary Scott  <zachary@z...>
+
+	* lib/weakref.rb (rdoc): Clean up usage, add example,
+	  note ArgumentError on WeakRef.new
+
 Sun Dec  2 16:45:00 2012  Zachary Scott  <zachary@z...>
 
 	* gc.c (WeakMap): Add doc for internal reference, use lib/weakref.rb
Index: lib/weakref.rb
===================================================================
--- lib/weakref.rb	(revision 38138)
+++ lib/weakref.rb	(revision 38139)
@@ -1,18 +1,66 @@
 require "delegate"
 
 # Weak Reference class that allows a referenced object to be
-# garbage-collected.  A WeakRef may be used exactly like the object it
-# references.
+# garbage-collected.
 #
+# A WeakRef may be used exactly like the object it references.
+#
 # Usage:
 #
-#   foo = Object.new
-#   foo = Object.new
+#   foo = Object.new            # create a new object instance
 #   p foo.to_s                  # original's class
-#   foo = WeakRef.new(foo)
+#   foo = WeakRef.new(foo)      # reassign foo with WeakRef instance
 #   p foo.to_s                  # should be same class
-#   ObjectSpace.garbage_collect
+#   GC.start                    # start the garbage collector
 #   p foo.to_s                  # should raise exception (recycled)
+#
+# == Example
+#
+# With help from WeakRef, we can implement our own redimentary 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.
+#
+#     require 'weakref'
+#
+#     class WeakHash < Hash
+#       def []= key, obj
+#         super WeakRef.new(key), WeakRef.new(obj)
+#       end
+#     end
+#
+# 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 key's, otherwise you
+# will get an ArgumentError because WeakRef cannot create a finalizer for a
+# Symbol. Symbols are immutable and cannot be garbage collected.
+#
+# Let's see it in action:
+#
+#   omg = "lol"
+#   c = WeakHash.new
+#   c['foo'] = "bar"
+#   c['baz'] = Object.new
+#   c['qux'] = omg
+#   puts c.inspect
+#   #=> {"foo"=>"bar", "baz"=>#<Object:0x007f4ddfc6cb48>, "qux"=>"omg"}
+#
+#   # Now run the garbage collector
+#   GC.start
+#   c['foo'] #=> nil
+#   c['baz'] #=> nil
+#   c['qux'] #=> nil
+#   omg      #=> "lol"
+#
+#   puts c.inspect
+#   #=> WeakRef::RefError: Invalid Reference - probably recycled
+#
+# You can see the local variable +omg+ stayed, although it's 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.
 
 class WeakRef < Delegator
 
@@ -27,6 +75,9 @@
 
   ##
   # Creates a weak reference to +orig+
+  #
+  # Raises an ArgumentError if the given +orig+ is immutable, such as Symbol,
+  # Fixnum, or Float.
 
   def initialize(orig)
     case orig

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]