60 votes

Vérifier plusieurs éléments dans un tableau en utilisant .include? -- Débutant Ruby

Existe-t-il un meilleur moyen d'écrire ceci :

si montableau.include? 'val1' ||
   montableau.include? 'val2' ||
   montableau.include? 'val3' ||
   montableau.include? 'val4'

109voto

tokland Points 29813

En utilisant les intersections de jeux de données (Array#:&) :

(monTableau & ["val1", "val2", "val3", "val4"]).présent?

Vous pouvez également faire une boucle (any? s'arrêtera à la première occurrence) :

monTableau.any? { |x| ["val1", "val2", "val3", "val4"].include?(x) }

C'est bon pour les petits tableaux, dans le cas général, il vaut mieux avoir des prédicats O(1) :

valeurs = ["val1", "val2", "val3", "val4"].to_set
monTableau.any? { |x| valeurs.include?(x) }

Avec Ruby >= 2.1, utilisez Set#intersect :

monTableau.to_set.intersect?(valeurs.to_set)

1 votes

Y a-t-il quelque chose de plus simple à lire comme ceci if myarray.include? ['val1', 'val2', 'val3'] Sinon, je suppose que votre réponse semble la meilleure.

0 votes

@Hopstream, a ajouté une autre implémentation avec any?

2 votes

Pourquoi utiliser la forme négative ? Pourquoi ne pas simplement utiliser (self & other).any? au lieu de !(self & other).empty?

5voto

Jeremy Richards Points 530

Créez votre propre méthode réutilisable:

class String
  def include_any?(array)
    array.any? {|i| self.include? i}
  end
end

Utilisation

"une chaîne avec plusieurs mots".include_any?(["une", "chaîne"])

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