diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-05-01 07:46:23 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-05-01 07:46:23 +0000 |
commit | 8dded0725b1ed215c8da1131a132b4ca6eb2f434 (patch) | |
tree | 51bf4044248538ccb728e87b13b3b74bf4e798b9 /lib/set.rb | |
parent | 35899279e86fdf2a742e49a295058216f7212a10 (diff) |
* lib/set.rb (SortedSet#add): Do not let an uncomparable object
in. [Bug #118]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23320 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/set.rb')
-rw-r--r-- | lib/set.rb | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/lib/set.rb b/lib/set.rb index 7b8896c335..ec42b93fab 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -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 @@ class Set 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 @@ class SortedSet < Set @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 @@ class SortedSet < Set 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 |