ruby-on-rails - unless - ruby switch videos
Declaración de caso con múltiples valores en cada bloque ''cuando'' (3)
En una declaración de case
, a ,
es el equivalente de ||
en una sentencia if
.
case car
when ''toyota'', ''lexus''
# code
end
Algunas otras cosas que puedes hacer con una declaración del caso Ruby
La mejor manera que puedo describir lo que estoy buscando es mostrarte el código fallido que he intentado hasta ahora:
case car
when [''honda'', ''acura''].include?(car)
# code
when ''toyota'' || ''lexus''
# code
end
Tengo alrededor de 4 o 5 diferentes when
situaciones deberían ser activadas por aproximadamente 50 posibles valores diferentes de car
. ¿Hay alguna manera de hacer esto con los bloques de case
o debo intentar un bloque masivo if
?
Otra buena manera de poner tu lógica en 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
Podría aprovechar las ventajas de la sintaxis aplastante o "splat" de ruby.
Esto hace when
cláusulas sobrepasadas when
exceso (tenga más de 10 valores para probar por rama si entiendo correctamente) sean un poco más legibles 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 usar un hash como una tabla de despacho, con claves para cada valor de car
y valores que son algún objeto llamable que encapsula el código que desea ejecutar.