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 whensituaciones diferentes que deberían ser activadas por aproximadamente 50 valores posibles diferentes de car. ¿Hay alguna manera de hacer esto con casebloques o debería intentar un ifbloque 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.oro||aquí porquewhentoma 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, bowhen (a or b), el último de los cuales evalúa la expresióna or bprimero 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 unaorexpresión real en el lado derecho de un momento.Puede aprovechar el "splat" de Ruby o la sintaxis de aplanamiento.
Esto hace que las
whenclá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
cary valores que son un objeto invocable que encapsula el código que desea ejecutar.fuente
whencolas. Gracias por compartir.Otra buena manera de poner su lógica en los datos es algo como esto:
fuente