411 votes

Déclaration 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 qui a échoué 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 différents when des situations qui devraient être déclenchées par environ 50 valeurs différentes possibles de car . Y a-t-il un moyen de faire cela avec case blocs ou devrais-je essayer un if bloc ?

888voto

Charles Caldwell Points 5511

Dans un case déclaration, une , est l'équivalent de || dans un if déclaration.

case car
   when 'toyota', 'lexus'
      # code
end

Quelques autres choses que vous pouvez faire avec une déclaration de cas Ruby

1 votes

Ce lien propose un meilleur résumé des instructions case en Ruby (et il inclut également des exemples de la syntaxe regexp et splat).

0 votes

Je ne sais pas pourquoi, mais cette situation étrange se produit : Quand j'écris ceci : when "toyota", "lexus" j'obtiens : unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError) . Cependant, quand j'écris ceci : when "toyota","lexus" cela fonctionne. La seule différence est un espace après la virgule.

0 votes

@FurkanAyhan C'est bizarre. Je suis allé de l'avant et testé le code juste pour être sûr et ça marche. Je pense qu'il y a quelque chose d'autre dans votre code qui provoque cette erreur. Est-il possible que vous ayez oublié de fermer une chaîne quelque part ou quelque chose comme ça ?

122voto

pilcrow Points 20628

Vous pouvez tirer parti de la syntaxe "splat" ou aplatissement de ruby.

Cela rend les plantes envahissantes when 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 commune serait d'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.

0 votes

C'est ce que j'ai fini par utiliser, même si je me sens mal d'enlever la coche de quelqu'un :D

0 votes

Une solution brillante pour les longues when lignes. Merci de partager.

3voto

Ped Points 11

Rappelez-vous que switch/case (case/when, etc.) consiste simplement à comparer valeurs . J'aime la réponse officielle dans ce cas pour une simple comparaison de liste de chaînes de caractères avec ou, mais pour une logique conditionnelle / de correspondance plus exotique,

case true
  when ['honda', 'acura'].include?(car)
    # do something
  when (condition1 && (condition2 || condition3))
    # do  something different
  else
    # do something else
end

0voto

Hew Wolff Points 825

Une autre façon de mettre votre logique dans les données est quelque chose comme ceci :

# 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

0voto

Matheus Porto Points 99

Vous pourriez faire quelque chose comme ceci (inspiré par la réponse de @pilcrow) :

honda  = %w[honda acura civic element fit ...]
toyota = %w[toyota lexus tercel rx yaris ...]

honda += %w[ev_ster concept_c concept_s ...] if include_concept_cars

case car
when *toyota
  # Do something for Toyota cars
when *honda
  # Do something for Honda cars
...
end

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