web-dev-qa-db-fra.com

Instruction de cas avec plusieurs valeurs dans chaque bloc 'When'

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?

289
Nick

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

620
Charles Caldwell

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.

95
pilcrow

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
0
Hew Wolff