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

ruby-changes:11681

From: knu <ko1@a...>
Date: Fri, 1 May 2009 16:46:39 +0900 (JST)
Subject: [ruby-changes:11681] Ruby:r23320 (trunk): * lib/set.rb (SortedSet#add): Do not let an uncomparable object

knu	2009-05-01 16:46:23 +0900 (Fri, 01 May 2009)

  New Revision: 23320

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

  Log:
    * lib/set.rb (SortedSet#add): Do not let an uncomparable object
      in. [Bug #118]

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23319)
+++ ChangeLog	(revision 23320)
@@ -1,3 +1,8 @@
+Fri May  1 16:44:11 2009  Akinori MUSHA  <knu@i...>
+
+	* lib/set.rb (SortedSet#add): Do not let an uncomparable object
+	  in. [Bug #118]
+
 Fri May  1 13:18:01 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* eval_intern.h (_longjmp): never return.  see [ruby-core:23241]
Index: lib/set.rb
===================================================================
--- lib/set.rb	(revision 23319)
+++ lib/set.rb	(revision 23320)
@@ -20,7 +20,7 @@
 #
 # The method +to_set+ is added to Enumerable for convenience.
 #
-# See the Set class for an example of usage.
+# See the Set and SortedSet documentation for examples of usage.
 
 
 #
@@ -451,7 +451,35 @@
   end
 end
 
-# SortedSet implements a set which elements are sorted in order.  See Set.
+# 
+# SortedSet implements a Set that guarantees that it's element are
+# yielded in sorted order (according to the return values of their
+# #<=> methods) when iterating over them.
+# 
+# All elements that are added to a SortedSet must include the
+# Comparable module.
+# 
+# Also, all elements must be <em>mutually comparable</em>: <tt>el1 <=>
+# el2</tt> must not return <tt>nil</tt> for any elements <tt>el1</tt>
+# and <tt>el2</tt>, else an ArgumentError will be raised when
+# iterating over the SortedSet.
+#
+# == Example
+# 
+#   require "set"
+#   
+#   set = SortedSet.new(2, 1, 5, 6, 4, 5, 3, 3, 3)
+#   ary = []
+#   
+#   set.each do |obj|
+#     ary << obj
+#   end
+#   
+#   p ary # => [1, 2, 3, 4, 5, 6]
+#   
+#   set2 = SortedSet.new(1, 2, "3")
+#   set2.each { |obj| } # => raises ArgumentError: comparison of Fixnum with String failed
+#   
 class SortedSet < Set
   @@setup = false
 
@@ -476,6 +504,12 @@
 	    @hash = RBTree.new
 	    super
 	  end
+	  
+	  def add(o)
+	    o.is_a?(Comparable) or raise ArgumentError, "value must be comparable"
+	    super
+	  end
+	  alias << add
 	}
       rescue LoadError
 	module_eval %{
@@ -495,9 +529,9 @@
 	  end
 
 	  def add(o)
+	    o.is_a?(Comparable) or raise ArgumentError, "value must be comparable"
 	    @keys = nil
-	    @hash[o] = true
-	    self
+	    super
 	  end
 	  alias << add
 

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

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