Ruby a un cas Envelopper plusieurs variables dans un tableau (comme Je vais aller de l'avant et répondre avec une réponse à la communauté-wiki avec un coup de poignard (vaincu) à cette question. P> assez puissant. Quelle est la méthode "canonique" de correspondre à des critères contre plusieurs variables sans simplement nidifier
affaire code>? P>
[x, y] code>) et correspondant à ce qu'elle n'est pas équivalente, car RUBY ne applique pas le cas magique
=== code> opérateur aux éléments em> de la matrice; L'opérateur est appliqué uniquement à la matrice elle-même. P>
4 Réponses :
Vous devez utiliser un Par exemple, si vous souhaitez correspondre à si..elsif..elift..else code> et assurez-vous que les variables que vous souhaitez faire correspondre contre apparaissent sur le côté droit du
=== Code> Opérateur (qui est ce que
cas code> est essentiellement).
x code> et
y code> contre certains critères : p>
Si ce modèle est suffisamment courant dans votre code pour garantir une expression économique, vous pouvez le faire vous-même:
class BiPartite attr_reader :x, :y def self.[](x, y) BiPartite.new(x, y) end def initialize(x, y) @x, @y = x, y end def ===(other) x === other.x && y === other.y end end .... case BiPartite[x, y] when BiPartite[SomeType, 1..10] puts "some_value" when BiPartite[:some_symbol, 11..20] puts "some_other_value" end
+1 Y a-t-il un moyen non dégoûtant de faire ce travail avec un nombre arbitraire de paramètres? En fait, les idées m'appartiennent à l'esprit et n'invimentent pas la modification de la classe code> de la classe ...
Ceci est un moyen simpliste d'ajouter === code>:
+1 Ceci est définitivement plus propre que ma deuxième réponse, mais ne modifie pas quelque peu les classes intégrées découragées? C'est une véritable question; Je suis nouveau à Ruby.
En outre, pourquoi faites-vous une copie de autre code>?
shift code> affectera le tableau passé comme paramètre sinon? Je suppose que je vais mettre à jour mon exemple pour refléter cela (j'ai déjà volé
array.all? Code>, que je ne savais pas ...
Je pense que c'est une matrice de modification sûre de cette façon, puisque le tableau ne met pas en œuvre === code>. Vous entrez dans des eaux potentiellement dangereuses lorsque vous remplacez une classe de base d'une manière qui enfreint le comportement attendu.
Je suis allé de l'avant et j'ai supprimé ma deuxième réponse. Pour ceux qui étaient curieux, c'était une catégorie code> correspondant code> qui implémentée Opérateur === code>. Un tableau pourrait être transmis à son constructeur avec
match.new ([chaîne, 1..10]) code>, il pourrait donc être utilisé après
quand code>.
NE PAS LES CLASSES COTE DE SINGEY PATCH POUR "COMPIENCEMENT" comme celui-ci, c'est une mauvaise pratique. Au mieux, il est confus aux gens de lire votre code. Au pire, === code> peut être ajouté à l'avenir, ou quelqu'un d'autre le remplace d'un comportement différent. Si vous voulez vraiment faire cela, enveloppez vos tableaux dans une classe personnalisée qui implémente
=== code> (tel que la classe code> bipartite code> ci-dessous).
Depuis Ruby's L'opérateur de splat convertit une liste d'arguments en une matrice, aussi fréquemment observée dans P> moins bien connu est le fait qu'il effectue également l'opération inverse - transformant un tableau dans une liste d'arguments. p> donc dans ce cas, vous pourriez faire quelque chose comme p> Quand Code> Le mot clé prend en charge une liste de valeurs séparées par des virgules, vous pouvez utiliser l'opérateur SPLAT
* CODE>. Ceci est bien sûr en supposant que vous parlez d'un ensemble de valeurs discrètes dans ou pourrait devenir une matrice.
Après avoir réaffecté ceci, je me suis peut-être mave mal lire la question initiale - je pensais que la comparaison était entre une variable et une éventuelle de valeurs correspondantes possibles pour cela.
Autant que je sache, Ruby applique
=== code> à chaque élément ... Ideone. com / ymalz
@Nakilon j'ai testé et il ne semble pas l'appliquer de manière récursive. Par exemple,
['Hello', 3] code> ne correspond pas à
[chaîne, 3] code>.
AAAA ... Désolé, ma faute. Différence oubliée entre
== code> et
=== code>.
Je soupçonne que le tableau hérite
=== code> à partir de l'objet, le comportement par défaut permet de comparer les valeurs de hachage des deux côtés du test, de ne pas tester le contenu. Si vous souhaitez un test de types et de valeurs, vous devez ajouter
=== code> au tableau et mettre en œuvre le comportement souhaité.