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

ruby-changes:30201

From: knu <ko1@a...>
Date: Tue, 30 Jul 2013 18:58:24 +0900 (JST)
Subject: [ruby-changes:30201] knu:r42253 (trunk): Add Set#intersect? and #disjoint?.

knu	2013-07-30 18:58:13 +0900 (Tue, 30 Jul 2013)

  New Revision: 42253

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

  Log:
    Add Set#intersect? and #disjoint?.
    
    * lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
      testing if two sets have any element in common.
      [ruby-core:45641] [Feature #6588] Based on the code by marcandre.

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/lib/set.rb
    trunk/test/test_set.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42252)
+++ ChangeLog	(revision 42253)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Jul 30 18:52:27 2013  Akinori MUSHA  <knu@i...>
+
+	* lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
+	  testing if two sets have any element in common.
+	  [ruby-core:45641] [Feature #6588] Based on the code by marcandre.
+
 Tue Jul 30 17:16:15 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* sprintf.c (ruby__sfvextra): add QUOTE flag to escape unprintable
Index: lib/set.rb
===================================================================
--- lib/set.rb	(revision 42252)
+++ lib/set.rb	(revision 42253)
@@ -231,6 +231,23 @@ class Set https://github.com/ruby/ruby/blob/trunk/lib/set.rb#L231
   end
   alias < proper_subset?
 
+  # Returns true if the set and the given set have at least one
+  # element in common.
+  def intersect?(set)
+    set.is_a?(Set) or raise ArgumentError, "value must be a set"
+    if size < set.size
+      any? { |o| set.include?(o) }
+    else
+      set.any? { |o| include?(o) }
+    end
+  end
+
+  # Returns true if the set and the given set have no element in
+  # common.  This method is the opposite of +intersect?+.
+  def disjoint?(set)
+    !intersect?(set)
+  end
+
   # Calls the given block once for each element in the set, passing
   # the element as parameter.  Returns an enumerator if no block is
   # given.
Index: NEWS
===================================================================
--- NEWS	(revision 42252)
+++ NEWS	(revision 42253)
@@ -141,6 +141,11 @@ with all sufficient information, see the https://github.com/ruby/ruby/blob/trunk/NEWS#L141
   * REXML::Text#<< supports method chain like 'text << "XXX" << "YYY"'.
   * REXML::Text#<< supports not "raw" mode.
 
+* Set
+  * New methods:
+    * Set#intersect?
+    * Set#disjoint?
+
 === Stdlib compatibility issues (excluding feature bug fixes)
 
 * Set
Index: test/test_set.rb
===================================================================
--- test/test_set.rb	(revision 42252)
+++ test/test_set.rb	(revision 42253)
@@ -297,6 +297,46 @@ class TC_Set < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/test_set.rb#L297
     assert_equal(false, Set[].proper_subset?(Set[]))
   end
 
+  def assert_intersect(expected, set, other)
+    case expected
+    when true
+      assert_send([set, :intersect?, other])
+      assert_send([other, :intersect?, set])
+      assert_not_send([set, :disjoint?, other])
+      assert_not_send([other, :disjoint?, set])
+    when false
+      assert_not_send([set, :intersect?, other])
+      assert_not_send([other, :intersect?, set])
+      assert_send([set, :disjoint?, other])
+      assert_send([other, :disjoint?, set])
+    when Class
+      assert_raises(expected) {
+        set.intersect?(other)
+      }
+      assert_raises(expected) {
+        set.disjoint?(other)
+      }
+    else
+      raise ArgumentError, "%s: unsupported expected value: %s" % [__method__, expected.inspect]
+    end
+  end
+
+  def test_intersect?
+    set = Set[3,4,5]
+
+    assert_intersect(ArgumentError, set, 3)
+    assert_intersect(ArgumentError, set, [2,4,6])
+
+    assert_intersect(true, set, Set[2,4])
+    assert_intersect(true, set, Set[5,6,7])
+    assert_intersect(true, set, Set[1,2,6,8,4])
+
+    assert_intersect(false, set, Set[])
+    assert_intersect(false, set, Set[0,2])
+    assert_intersect(false, set, Set[0,2,6])
+    assert_intersect(false, set, Set[0,2,6,8,10])
+  end
+
   def test_each
     ary = [1,3,5,7,10,20]
     set = Set.new(ary)

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

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