2012-04-17 16 views
222

La mejor manera que puedo describir lo que estoy buscando es que le muestre el código no lo he intentado hasta ahora:instrucción Case con múltiples valores en cada 'cuándo' bloque

case car 
    when ['honda', 'acura'].include?(car) 
    # code 
    when 'toyota' || 'lexus' 
    # code 
end 

tengo obtuvo alrededor de 4 o 5 situaciones diferentes when que deberían activarse con aproximadamente 50 valores posibles diferentes de car. ¿Hay alguna manera de hacer esto con los bloques case o debería probar un bloque masivo if?

Respuesta

486

En una declaración case, , es el equivalente a || en una declaración if.

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

Some other things you can do with a Ruby case statement

+0

gran enlace, gracias! – Nick

+1

[Este enlace] (http://ilikestuffblog.com/2008/04/15/how-to-write-case-switch-statements-in-ruby/) tiene un mejor resumen de declaraciones de casos en Ruby (e incluye ejemplos de la sintaxis de regexp y splat también). – rsenna

+0

No sé por qué, pero esta extraña situación ocurre: Cuando escribo esto: ' cuando "Toyota", "Lexus"', me sale: 'inesperada tSTRING_BEG, esperando keyword_do o '{' o" ('(SyntaxError) ' Sin embargo, cuando escribo esto:.... ' cuando "Toyota", "Lexus" ', funciona La única diferencia es un espacio después de la coma –

77

Es posible que tome ventaja de "splat" de rubí o aplanar sintaxis.

Esto hace overgrown when cláusulas - usted tiene aproximadamente 10 valores para probar por rama si entiendo correctamente - un poco más legible en mi opinión. Además, puede modificar los valores para probar en tiempo de ejecución. Por ejemplo:

honda = ['honda', 'acura', 'civic', 'element', 'fit', ...] 
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...] 
... 

if include_concept_cars: 
    honda += ['ev-ster', 'concept c', 'concept s', ...] 
    ... 

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

Otro enfoque común sería utilizar un hash como una mesa de despacho, con claves para cada valor de car y valores que son un objeto invocable que encapsula el código que desea ejecutar.

+0

Definitivamente más legible en el caso de @ Nick. (Sin juego de palabras) –

+0

Esto es lo que terminé usando, aunque me siento mal quitándome la marca de verificación de alguien: D – Nick

+0

Solución brillante para líneas de "cuándo" largas. Gracias por compartir. – Pistos

0

Otra buena manera de poner su lógica en los datos es algo como esto:

# 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 
Cuestiones relacionadas