1451 votes

vérifier si une valeur existe dans la gamme Ruby

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?

2145voto

Brian Campbell Points 101107

Vous êtes à la recherche pour include?:

>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true

278voto

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 Enumerables, 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?...

174voto

schmitzelburger Points 1194

Essayez

['Cat', 'Dog', 'Bird'].include?('Dog')

62voto

bom_d_van Points 426

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

52voto

DigitalRoss Points 80400

Utiliser Enumerable#include:

a.include? 'Dog'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X