Вы можете использовать Array#uniq
, но вам нужно внести небольшое изменение в свой класс. Per the docs, uniq
"сравнивает значения с использованием методов hash
и eql?
для эффективности", поэтому вам необходимо определить hash
и eql?
, чтобы они идентифицировали два объекта вашего класса как дубликаты. Например, если два объекта с одинаковыми a
и b
атрибутов являются дубликатами, вы можете сделать это:
class Foo
attr_reader :a, :b
def initialize(a, b)
@a, @b = a, b
end
def hash
[ a, b ].hash
end
def eql?(other)
hash == other.hash
end
end
arr = [ Foo.new(1, 2), Foo.new(3, 3), Foo.new(3, 3) ]
p arr.uniq
# => [#<Foo:0x007f686ac36700 @a=1, @b=2>, #<Foo:0x007f686ac366b0 @a=3, @b=3>]
В качестве альтернативы, если вы не хотите или не можете определить hash
и eql?
методы, которые вы можете использовать блок форма uniq
:
class Bar
attr_reader :a, :b
def initialize(a, b)
@a, @b = a, b
end
end
arr2 = [ Bar.new(1, 2), Bar.new(3, 3), Foo.new(3, 3) ]
p arr2.uniq {|obj| [ obj.a, obj.b ] }
# => [#<Bar:0x007fe80f7b6750 @a=1, @b=2>, #<Bar:0x007fe80f7b6700 @a=3, @b=3>]
Вы можете увидеть both of these на repl.it.
Трудно понять, что вы здесь задаете. Попробуйте привести пример, который достаточно мал, и мы можем запустить и понять, что вы пытаетесь сделать. –
Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[ask]» вместе со связанными страницами и «[mcve]». При запросе нам нужно увидеть не просто синтаксически неправильное определение массива. Нам также нужно посмотреть, что вы попробовали, и объяснить, почему это не сработало. В настоящее время похоже, что вы не пробовали, и вы просите нас написать код для вас, поэтому доказательства усилий важны. См. Http://meta.stackoverflow.com/questions/261592. –