我正在尝试遍历数组并在对象中查找匹配的属性。例如:
<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 :(得分:2)
您需要在Sock
上重新定义#==
:
class Sock
def ==(other_sock)
brand == other_sock.brand && style == other_sock.style
end
end
默认情况下,如果两个对象相同,则所有Ruby对象上的#==
都返回true:
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 :(得分:0)
添加到@faraz答案,您可以使用集合上的Enumerable#find
选择匹配的袜子:
sock = @socks.first # your desired sock
other_sock = @socks.find {|sock| sock == @sock }