Иногда возникает задача удалить дубликаты из массива объектов. В Ruby для решения этой задачи в классе Array есть методы uniq и uniq!. Отличие первого от второго состоит лишь в том, что второй производит in place модификацию массива, а первый возвращает результат в виде массива. Для того, чтобы эти методы работали для custom классов необходимо чтобы у классов были определены методы hash и eql?. class TestClass attr_reader :a, :b, :c #Ctor def initialize(a,b,c) @a, @b, @c = a, b, c end def hash "#@a #@b #@c".hash end def ==(p) @a ==p.a and @b == p.b and @c == p.c end def eql?(p) self == p end def to_s "#@a,#@b,#@c" end end a = [] a << TestClass.new(1,2,3) a << TestClass.new(1,2,3) a << TestClass.new(3,2,1) a << TestClass.new(3,2,3) a << TestClass.new(2,3,3) a.uniq! a.each do |elem| p elem.to_s end Т.е. одного eql? не достаточно, как это указано в PickAxe а нужен еще и hash method который должен возвращать цело...