Si j'ai une valeur en 'Dog'
et un tableau ['Cat', 'Dog', 'Bird']
, comment puis-je vérifier ce w/o en boucle à travers. Est-il un moyen simple de vérifier si la valeur existe, rien de plus?
Réponses
Trop de publicités?Vous êtes à la recherche pour include?
:
>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true
Il y a un in?
méthode de ActiveSupport
(une partie de Rails) depuis la v3.1, comme l'a souligné @campaterson. Donc, à l'intérieur des Rails, ou si vous require 'active_support'
, vous pouvez écrire:
'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false
Otoh, que, il n'y a pas d' in
de l'opérateur ou de l' #in?
méthode en Ruby lui-même, même si il a été proposé avant, en particulier par Yusuke Endoh un top notch membre de ruby-core.
Comme souligné par d'autres, la méthode inverse include?
il existe, pour tous les Enumerable
s, y compris Array
, Hash
, Set
, Range
:
['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false
Notez que si vous avez beaucoup de valeurs de votre tableau, ils seront tous vérifiés les uns après les autres ( O(n)
), tandis que, recherche pour l'un de hachage sera constante de temps (j'.e O(1)
). Donc, si vous avez de la matrice est constante, par exemple, c'est une bonne idée d'utiliser un Set
à la place. E. g:
require 'set'
ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase
# etc
]
def foo(what)
raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)
bar.send(what)
end
Un test rapide révèle que l'appelant include?
sur un 10 de l'élément Set
3,5 x plus rapide que d'appeler sur l'équivalent Array
(si l'élément n'est pas trouvé).
Une clôture finale remarque: méfiez-vous lors de l'utilisation d' include?
sur Range
, il y a des subtilités, reportez-vous à la doc et de les comparer avec cover?
...
Si vous voulez vérifier par un bloc, vous pouvez essayer de tout? ou tous?.
%w{ant bear cat}.any? {|word| word.length >= 3} #=> true
%w{ant bear cat}.any? {|word| word.length >= 4} #=> true
[ nil, true, 99 ].any? #=> true
Les détails sont ici: http://ruby-doc.org/core-1.9.3/Enumerable.html
Mon inspiration vient de là: http://stackoverflow.com/a/10342734/576497