2015-06-03 2 views
0

Я пытаюсь выполнить итерацию по массиву и найти соответствующие атрибуты внутри объектов. Например:Найти подходящие объекты в Ruby

<SockDrawer:0x007f834c9a49b8 @socks=[#<Sock:0x007f834c9a4cd8 @brand="Nike", @style="quarter", @color="white">, #<Sock:0x007f834c9a4c10 @brand="Nike", @style="quarter", @color="black">, #<Sock:0x007f834c9a4af8 @brand="Nike", @style="quarter", @color="red">, #<Sock:0x007f834c9a4a30 @brand="Nike", @style="quarter", @color="white">] 

Таким образом, мы можем видеть, что мой @socks массив имеет два носка, которые соответствуют. Я пытаюсь написать метод, чтобы найти соответствующие атрибуты, чтобы я мог вытащить два белых носка и носить их.

Мой мыслительный процесс был каким-то образом начать с первого объекта и сравнить его с остальными объектами (Перебор массива для поиска совпадения.)

+0

Желает _search_ для конкретного атрибута (например, «белого») или просто получить как правило, все совпадающие пары для данного атрибута, например, возвращают 2 белых носка и два красных (если у вас есть второй красный) –

+0

Ищете все атрибуты. Сравните бренд, цвет, длину. – Nappstir

+0

Добро пожаловать в переполнение стека. У вас есть начало вопроса, но какой минимальный пример кода, который вы написали, чтобы решить это, или где вы искали, и что вы не поняли о том, что вы читали? Похоже, вы просите нас написать код для того, что должно быть очень простой проблемой. Кроме того, вместо того, чтобы показывать проверку массива, вместо этого предоставляйте четкий текст, определение источника массива или минимальное определение объекта вместе с инициализатором для массива. Это помогает нам помочь вам и помогает другим, которые ищут похожий ответ. –

ответ

2

Вам нужно переопределить #== на Sock :

class Sock 
    def ==(other_sock) 
    brand == other_sock.brand && style == other_sock.style 
    end 
end 

По умолчанию #== на всем объекте Ruby, возвращает истину, если два объекта одинаковы:

a = Object.new # => #<Object:0x0000000128df60> 
a.__id__ # => 9727920 
b = Object.new # => #<Object:0x00000001289cd0> 
b.__id__ # => 9719400 
a == a # => true 
a == b # => false 

Удовлетворяющий факт: объекты из некоторых встроенных классов, таких как целые числа, повторно используются в качестве оптимизации.

Object.new.__id__ == Object.new.__id__ # => false 
(2 * 8).__id__ == (4 * 4).__id__ # => true 
+1

s/branch/brand / – user12341234

0

Добавление @faraz ответа, вы можете выбрать соответствующий носок с помощью Enumerable#find на коллекции:

sock = @socks.first # your desired sock 
other_sock = @socks.find {|sock| sock == @sock } 
Смежные вопросы