在Ruby

时间:2015-06-03 19:14:49

标签: arrays 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数组有两个匹配的袜子。我正在尝试编写一种方法来找到匹配的属性,这样我就可以拉出两条白色袜子并穿上它们。

我的思维过程以某种方式从第一个对象开始,并将其与其余对象进行比较(遍历数组以找到匹配项。)

2 个答案:

答案 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 }