summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/set.rb11
2 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 291f8c99b3..8202436bc8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Nov 2 14:48:30 2006 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#^): Fix XOR operation against a container that
+ holds duplicate values. [issue: #6444]
+
Wed Nov 1 02:41:38 2006 Akinori MUSHA <knu@iDaemons.org>
* ext/digest/lib/digest/hmac.rb (Digest::HMAC::update): Minor
diff --git a/lib/set.rb b/lib/set.rb
index 0ad47c842f..e244712833 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -301,8 +301,8 @@ class Set
# ((set | enum) - (set & enum)).
def ^(enum)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
- n = dup
- enum.each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
+ n = Set.new(enum)
+ each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
n
end
@@ -1049,6 +1049,13 @@ class TC_Set < Test::Unit::TestCase
assert_equal(Set[2,4], ret)
end
+ def test_xor
+ set = Set[1,2,3,4]
+ ret = set ^ [2,4,5,5]
+ assert_not_same(set, ret)
+ assert_equal(Set[1,3,5], ret)
+ end
+
def test_eq
set1 = Set[2,3,1]
set2 = Set[1,2,3]