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) ... # 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 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. Gary