From 2ac3e207470a4866efa7b419cec7353f56ec9c65 Mon Sep 17 00:00:00 2001 From: knu Date: Thu, 2 Nov 2006 05:52:12 +0000 Subject: * lib/set.rb (Set#^): Fix XOR operation against a container that holds duplicate values. [issue: #6444] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@11265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/set.rb | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 291f8c99b..8202436bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Nov 2 14:48:30 2006 Akinori MUSHA + + * 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 * ext/digest/lib/digest/hmac.rb (Digest::HMAC::update): Minor diff --git a/lib/set.rb b/lib/set.rb index 0ad47c842..e24471283 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] -- cgit