La mejor forma en que puedo describir lo que estoy buscando es mostrarle el código fallido que he probado hasta ahora:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
Tengo alrededor de 4 o 5 when
situaciones diferentes que deberían ser activadas por aproximadamente 50 valores posibles diferentes de car
. ¿Hay alguna manera de hacer esto con case
bloques o debería intentar un if
bloque masivo ?
when "toyota", "lexus"
, me sale:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Sin embargo, cuando escribo esto:when "toyota","lexus"
funciona. La única diferencia es un espacio después de la coma.or
o||
aquí porquewhen
toma una serie de expresiones separadas por comas a la derecha, no un solo identificador. Debido a esto, si lo hubiera hechowhen a or b
, no está claro si esto debe tomarse como el equivalente dewhen a, b
owhen (a or b)
, el último de los cuales evalúa la expresióna or b
primero antes de arrojarla al cuándo. Es más sorprendente y menos fácil de manejar que el lenguaje tenga tokens que cambian el comportamiento en función del contexto, y luego no podría usar unaor
expresión real en el lado derecho de un momento.Puede aprovechar el "splat" de Ruby o la sintaxis de aplanamiento.
Esto hace que las
when
cláusulas demasiado crecidas (tienes alrededor de 10 valores para probar por rama si lo entiendo correctamente), en mi opinión, son un poco más legibles. Además, puede modificar los valores para probar en tiempo de ejecución. Por ejemplo:Otro enfoque común sería usar un hash como tabla de despacho, con claves para cada valor
car
y valores que son un objeto invocable que encapsula el código que desea ejecutar.fuente
when
colas. Gracias por compartir.Otra buena manera de poner su lógica en los datos es algo como esto:
fuente