On Thu, Apr 13, 2006 at 11:21:18PM +0900, jogloran wrote: > I need items to be compared based on their values, and not by object > equality, so I provide #== for the array elements. The problem is that I've > been trying to use Array#- as a set difference-like operation, and it > doesn't seem to respect any kind of user-provided means of defining > equality. A look into the Ruby source seems to indicate that it works by > populating a hash with the elements of the second array, then appending to > the result array if an element of the first array is in the hash. Does this > mean that it is impossible to get the behaviour I want from Array#- as it is > implemented? You have to define #hash and #eql?: RUBY_VERSION # => "1.8.4" class X attr_reader :foo def initialize(foo); @foo = foo end end [X.new(1), X.new(2)] - [X.new(1)] # => [#<X:0xb7deaf94 @foo=1>, #<X:0xb7deaf80 @foo=2>] X.new(1).hash # => -605071554 X.new(1).hash # => -605071594 class X def hash @foo.hash end def eql?(x) foo == x.foo end end [X.new(1), X.new(2)] - [X.new(1)] # => [#<X:0xb7dead50 @foo=2>] -- Mauricio Fernandez - http://eigenclass.org - singular Ruby