2010-01-29 57 views
1

使用索引方法,我试图找到一个值是否存在使用某个变量,如果该变量不存在,然后尝试另一个变量;有点像这样(下面第三行):Ruby:使用“索引”方法与“或”

a = [ "a", "b", "c" ] 
a.index("b") #=> 1 
a.index("z" or "y" or "x" or "b") #=> 1 

..meaning,如果“Z”不是阵列中找到,那么尝试“Y”;如果找不到y,则尝试x;如果找不到x,请尝试b

我该如何正确地做?

回答

2

TIMTOWTDI。但我更喜欢使用Array#inject。

%w(x y z b).inject(nil) { |i, e| i or a.index(e) } #=> 1 

还有另外一种方法可以更类似于您的伪代码。

class String 
    def | other 
    ->(e) { self==e || other==e } 
    end 
end 

class Proc 
    def | other 
    ->(e) { self.call(e) || other==e } 
    end 
end 

a.index(&('x' | 'y' | 'z' | 'b')) #=> 1 
+0

谢谢你恩!我真的很感谢这个很好的帮助:)非常感谢你的明确解释。 – andy 2010-01-29 01:06:14

+0

需要ruby 1.9作为' - >'lambda语法。 – 2010-01-29 02:02:42

+0

修复旧版本中的一个令人讨厌的错误; '%w(x y z).index(&('foo'|'bar'|'zzz'|'b'))'被评估为'2'。 – nonowarn 2010-01-29 02:48:52

2

取决于您的最终目标。如果你只是想看看a包含zyxb,你可以这样做:

(a & %w{z y x b}).length > 0 # gives true if a contains z, y, x and/or b. 

就是我们正在做的是看是否存在交集其中包含一些共享具有一组所需数量的元素,然后测试以查看是否存在任何这些元素。

+0

谢谢彼得。它完美的作品。非常感谢你:) – andy 2010-01-29 01:06:37