2010-01-29 31 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