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

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/

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