On Thu, 2005-09-22 at 02:16 +0900, David A. Black wrote:
> Hi --
> 
> On Thu, 22 Sep 2005, Gary Shea wrote:
> 
> > While writing an acceptance test, I needed to compare two sets of sets
> > of integers:
> >
> > require 'set'
> > a = Set.new([Set.new([3,4]), Set.new([5,6])])
> > b = Set.new([Set.new([3,4]), Set.new([5,6])])
> > puts #{a == b}\n"
> >
> > prints out 'false'.
> >
> > Apparently the built-in Set library uses Hash#includes? to determine if
> > an object is in the rhs set.  This method appears to use object id, so
> > set equality is based on set member object id.
> >
> > A naive #==(set) that works the way I think it should is pretty simple:
> >
> > def Set.my_eql?(set)
> 
> You'd want that to be an instance method, not a class method:
> 
>    class Set
>      def my_eql?(set)

Whoops :)

> 
> >  ...
> >  # this is the only part of my_eql? that differs from #==(set),
> >  # replacing the line 'set.all? { |o| hash.include?(o) }'
> >
> >  set.all? { |o|
> >    @hash.each_value do |my_o|
> >      if my_o == o
> >        last true
> >      end
> >      false
> >    end
> >  }
> > end
> 
> You could just do:
> 
>      set.all? {|x| any? {|y| x == y } }

Wow, that's almost mathematical set notation!  Nice.

> 
> > I'm sure this has come up before... is there a better solution?  This
> > one is fine for my purposes, but I would be nice there was a packaged
> > solution out there.
> 
> It did come up, quite recently I think.  I can't remember what the
> consensus was, if any.
> 
> 
> David
>