La meilleure façon de décrire ce que je recherche est de vous montrer le code manquant que j'ai essayé jusqu'à présent:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
J'ai environ 4 ou 5 situations when
différentes qui devraient être déclenchées par environ 50 valeurs possibles différentes de car
. Existe-t-il un moyen de faire cela avec les blocs case
ou devrais-je essayer un bloc massif if
?
Dans une instruction case
, un ,
est l'équivalent de ||
dans une instruction if
.
case car
when 'toyota', 'lexus'
# code
end
Quelques autres choses que vous pouvez faire avec une instruction de cas Ruby
Vous pourriez tirer parti de la "syntaxe" ou de la syntaxe d'aplatissement de Ruby.
Cela rend les clauses when
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:
honda = ['honda', 'acura', 'civic', 'element', 'fit', ...]
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...]
...
if include_concept_cars
honda += ['ev-ster', 'concept c', 'concept s', ...]
...
end
case car
when *toyota
# Do something for Toyota cars
when *honda
# Do something for Honda cars
...
end
Une autre approche courante consiste à 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.
Une autre façon intéressante de définir votre logique dans les données est la suivante:
# Initialization.
CAR_TYPES = {
foo_type: ['honda', 'acura', 'mercedes'],
bar_type: ['toyota', 'lexus']
# More...
}
@type_for_name = {}
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } }
case @type_for_name[car]
when :foo_type
# do foo things
when :bar_type
# do bar things
end