ruby-changes:44516
From: knu <ko1@a...>
Date: Sat, 5 Nov 2016 18:23:19 +0900 (JST)
Subject: [ruby-changes:44516] knu:r56589 (trunk): Add Set#compare_by_identity and Set#compare_by_identity?
knu 2016-11-05 18:23:14 +0900 (Sat, 05 Nov 2016) New Revision: 56589 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=56589 Log: Add Set#compare_by_identity and Set#compare_by_identity? * lib/set.rb (Set#compare_by_identity, Set#compare_by_identity?): New methods. [Feature #12210] Modified files: trunk/ChangeLog trunk/NEWS trunk/lib/set.rb trunk/test/test_set.rb Index: NEWS =================================================================== --- NEWS (revision 56588) +++ NEWS (revision 56589) @@ -189,6 +189,10 @@ with all sufficient information, see the https://github.com/ruby/ruby/blob/trunk/NEWS#L189 * pathname * New method: Pathname#empty? [Feature#12596] +* set + * New methods: Set#compare_by_identity and Set#compare_by_identity?. + [Feature #12210] + * WEBrick * Don't allow , as a separator [Bug #12791] Index: test/test_set.rb =================================================================== --- test/test_set.rb (revision 56588) +++ test/test_set.rb (revision 56589) @@ -715,6 +715,25 @@ class TC_Set < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/test_set.rb#L715 set1.add(set2) assert_equal(true, set1.inspect.include?('#<Set: {...}>')) end + + def test_compare_by_identity + a1, a2 = "a", "a" + b1, b2 = "b", "b" + c = "c" + array = [a1, b1, c, a2, b2] + + iset = Set.new.compare_by_identity + assert_send([iset, :compare_by_identity?]) + iset.merge(array) + assert_equal(5, iset.size) + assert_equal(array.map(&:object_id).sort, iset.map(&:object_id).sort) + + set = Set.new + assert_not_send([set, :compare_by_identity?]) + set.merge(array) + assert_equal(3, set.size) + assert_equal(array.uniq.sort, set.sort) + end end class TC_SortedSet < Test::Unit::TestCase Index: lib/set.rb =================================================================== --- lib/set.rb (revision 56588) +++ lib/set.rb (revision 56589) @@ -3,7 +3,7 @@ https://github.com/ruby/ruby/blob/trunk/lib/set.rb#L3 # # set.rb - defines the Set class #++ -# Copyright (c) 2002-2013 Akinori MUSHA <knu@i...> +# Copyright (c) 2002-2016 Akinori MUSHA <knu@i...> # # Documentation by Akinori MUSHA and Gavin Sinclair. # @@ -37,7 +37,8 @@ https://github.com/ruby/ruby/blob/trunk/lib/set.rb#L37 # Set uses Hash as storage, so you must note the following points: # # * Equality of elements is determined according to Object#eql? and -# Object#hash. +# Object#hash. Use Set#compare_by_identity to make a set compare +# its elements by their identity. # * Set assumes that the identity of each element does not change # while it is stored. Modifying an element of a set will render the # set to an unreliable state. @@ -91,6 +92,23 @@ class Set https://github.com/ruby/ruby/blob/trunk/lib/set.rb#L92 end end + # Makes the set compare its elements by their identity and returns + # self. This method may not be supported by all subclasses of Set. + def compare_by_identity + if @hash.respond_to?(:compare_by_identity) + @hash.compare_by_identity + self + else + raise NotImplementedError, "#{self.class.name}\##{__method__} is not implemented" + end + end + + # Returns true if the set will compare its elements by their + # identity. Also see Set#compare_by_identity. + def compare_by_identity? + @hash.respond_to?(:compare_by_identity?) && @hash.compare_by_identity? + end + def do_with_enum(enum, &block) # :nodoc: if enum.respond_to?(:each_entry) enum.each_entry(&block) if block Index: ChangeLog =================================================================== --- ChangeLog (revision 56588) +++ ChangeLog (revision 56589) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sat Nov 5 18:17:54 2016 Akinori MUSHA <knu@i...> + + * lib/set.rb (Set#compare_by_identity, Set#compare_by_identity?): + New methods. [Feature #12210] + Sat Nov 5 18:17:08 2016 SHIBATA Hiroshi <hsbt@r...> * lib/rdoc/*, test/rdoc/*: Update rdoc-5.0.0 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/