# Question about the Set class, XOR, and arrays

**URL:** <https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701>\
**Category:** Ruby\
**Created:** [November 7, 2006, 10:52am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701 "2006-11-07T10:52:56Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:52am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/1 "2006-11-07T10:52:56Z")

</div>

Hi all,

Ruby 1.8.5

irb(main):002:0\> Set[1,2,3] ^ Set[3,4,5,5]  
=\> #\<Set: {5, 1, 2, 4}\>

Ok, looks good.

irb(main):003:0\> Set[1,2,3] ^ [3,4,5,5]  
=\> #\<Set: {1, 2, 4}\>

What?! I’m confused. Do I need a refresher in Set theory or something?

Thanks,

Dan

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:52am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/2 "2006-11-07T10:52:58Z")

</div>

On Nov 1, 2006, at 12:25 PM, Daniel B. wrote:

> irb(main):002:0\> Set[1,2,3] ^ Set[3,4,5,5]  
> =\> #\<Set: {5, 1, 2, 4}\>
> 
> Ok, looks good.
> 
> irb(main):003:0\> Set[1,2,3] ^ [3,4,5,5]  
> =\> #\<Set: {1, 2, 4}\>
> 
> What?! I’m confused. Do I need a refresher in Set theory or something?

It is the way it is implemented… subsequent 5’s will toggle it on  
and off. You should file a bug.

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:52am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/3 "2006-11-07T10:52:59Z")

</div>

Daniel B. wrote:

> =\> #\<Set: {1, 2, 4}\>
> 
> What?! I’m confused. Do I need a refresher in Set theory or something?

I think I can guess why it is happening:

irb(main):009:0\> (0…10).each {|n| p Set[1,2,3] ^ ([3,4]+[5]\*n)}  
#\<Set: {1, 2, 4}\>  
#\<Set: {5, 1, 2, 4}\>  
#\<Set: {1, 2, 4}\>  
#\<Set: {5, 1, 2, 4}\>  
#\<Set: {1, 2, 4}\>  
#\<Set: {5, 1, 2, 4}\>  
#\<Set: {1, 2, 4}\>  
#\<Set: {5, 1, 2, 4}\>  
#\<Set: {1, 2, 4}\>  
#\<Set: {5, 1, 2, 4}\>  
#\<Set: {1, 2, 4}\>  
=\> 0…10

Looks like the array argument is used to flip-flop the elements of the  
set.

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:53am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/4 "2006-11-07T10:53:03Z")

</div>

Daniel B. wrote:

> =\> #\<Set: {1, 2, 4}\>
> 
> What?! I’m confused. Do I need a refresher in Set theory or something?

Are your irb entries above copied directly from the display? Or is this  
a  
1.8.5 problem?

$ ruby -v  
$ ruby 1.8.4 (2005-12-24) [i386-linux]

$irb  
irb(main):002:0\> require ‘set’  
=\> true  
irb(main):003:0\> Set[1,2,3] ^ Set[3,4,5,5]  
=\> #\<Set: {5, 1, 2, 4}\>  
irb(main):004:0\> Set[1,2,3] ^ Set[3,4,5,5]  
=\> #\<Set: {5, 1, 2, 4}\>  
irb(main):005:0\> Set[1,2,3] ^ Set[3,4,5,5]  
=\> #\<Set: {5, 1, 2, 4}\>

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:53am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/5 "2006-11-07T10:53:09Z")

</div>

Ryan D. wrote:

> > What?! I’m confused. Do I need a refresher in Set theory or something?
> 
> It is the way it is implemented… subsequent 5’s will toggle it on  
> and off. You should file a bug.

Done.

Thanks for confirming my sanity.

- Dan

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:55am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/6 "2006-11-07T10:55:27Z")

</div>

Jeffrey S. wrote:

> > > > =\> #\<Set: {1, 2, 4}\>  
> > > > about the intersection of a set with an array.  
> > > > Arrays already behave like sets in some ways. They have set-like  
> > > > operators:

irb(main):009:0\* [1,2,3] & [2,3,4]  
=\> [2, 3]  
irb(main):010:0\> [1,2,3] | [2,3,4]  
=\> [1, 2, 3, 4]  
irb(main):011:0\> [1,2,3] - [2,3,4]  
=\> [1]

But this argument falls down because arrays don’t have symmetric  
difference:

irb(main):012:0\> [1,2,3] ^ [2,3,4]  
NoMethodError: undefined method `^’ for [1, 2, 3]:Array  
from (irb):11

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [November 7, 2006, 10:54am UTC](https://www.ruby-forum.com/t/question-about-the-set-class-xor-and-arrays/74701/7 "2006-11-07T10:54:49Z")

</div>

Daniel B. wrote:

> > > What?! I’m confused. Do I need a refresher in Set theory or something?  
> > > It is the way it is implemented… subsequent 5’s will toggle it on  
> > > and off. You should file a bug.
> 
> Done.
> 
> Thanks for confirming my sanity.

In what way is this a bug? I’m not aware of set theory saying anything  
about the intersection of a set with an array.
