2010-01-29 3 views
1

En utilisant la méthode d'index, j'essaie de trouver si une valeur existe en utilisant une certaine variable, et si cette variable n'existe pas, essayez une autre variable; un peu quelque chose comme ça (3ème ligne ci-dessous):Ruby: Utilisation de la méthode "index" avec "OU"

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

..meaning que si « z » ne se trouve pas dans le tableau, puis essayez « y »; si y n'est pas trouvé, essayez x; Si x n'est pas trouvé, essayez b

Comment le ferais-je correctement?

Répondre

2

TIMTOWTDI. Mais je préfère utiliser Array # injecter.

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

Et il existe une autre façon de le faire avec plus semblable à votre pseudo-code.

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

Merci nwn! J'apprécie vraiment la grande aide :) Merci beaucoup pour l'explication claire. – andy

+0

requiert ruby ​​1.9 pour la syntaxe '->' lambda. –

+0

Correction d'un bug méchant dans l'ancienne révision; '% w (x y z) .index (& ('foo' | 'bar' | 'zzz' | 'b'))' a été évalué à '2'. – nonowarn

2

Dépend de votre objectif final. Si vous voulez juste voir si a contient une z, y, x ou b, vous pouvez le faire:

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

ce que nous faisons est de voir s'il y a une intersection ensemble où contient certains partagé éléments avec l'ensemble des quantités désirées, puis test pour voir s'il y avait un de ces éléments.

+0

Merci Peter. Cela fonctionne parfaitement. Merci beaucoup :) – andy

Questions connexes