La meilleure façon de décrire ce que je recherche est de vous montrer le code qui a échoué jusqu'à présent:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
J'ai environ 4 ou 5 when
situations différentes qui devraient être déclenchées par environ 50 valeurs différentes possibles de car
. Existe-t-il un moyen de le faire avec des case
blocs ou dois-je essayer un if
bloc massif ?
when "toyota", "lexus"
, je reçois:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Cependant, quand j'écris ceci:when "toyota","lexus"
ça marche. La seule différence est un espace après une virgule.or
ou||
ici car lewhen
prend une série d'expressions séparées par des virgules à sa droite, pas un seul identifiant. Pour cette raison, si vous l'aviezwhen a or b
, il n'est pas clair si cela doit être pris comme l'équivalent dewhen a, b
ouwhen (a or b)
, ce dernier évaluant l'expression ena or b
premier avant de la jeter dans le quand. Il est plus surprenant et moins facile à gérer pour le langage d'avoir des jetons qui changent le comportement en fonction du contexte, et alors vous ne seriez pas en mesure d'utiliser une vraieor
expression du côté droit d'un moment.Vous pourriez profiter de la syntaxe "splat" ou d'aplatissement de ruby.
Cela rend les
when
clauses envahissantes - vous avez environ 10 valeurs à tester par branche si je comprends bien - un peu plus lisible à mon avis. De plus, vous pouvez modifier les valeurs à tester lors de l'exécution. Par exemple:Une autre approche courante consisterait à utiliser un hachage comme table de répartition, avec des clés pour chaque valeur de
car
et des valeurs qui sont des objets appelables encapsulant le code que vous souhaitez exécuter.la source
when
lignes. Merci d'avoir partagé.Une autre bonne façon de mettre votre logique dans les données est quelque chose comme ceci:
la source