Los muchos usos de las sentencias case de Ruby

Cuando necesites usar algunas sentencias if / elsif podrías considerar usar una sentencia case de Ruby en su lugar. En este post, aprenderás unos cuantos casos de uso diferentes y cómo funciona todo realmente bajo el capó.

ruby case

Nota: En otros lenguajes de programación esto se conoce como sentencia switch.

Los componentes de una sentencia case en Ruby:

Palabra clave Descripción
case Inicia la definición de una sentencia case. Toma la variable con la que se va a trabajar.
when Toda condición que pueda coincidir es una sentencia when.
else Si nada coincide entonces haz esto. Opcional.

Caso Ruby & Rangos

La sentencia case es más flexible de lo que puede parecer a primera vista. Veamos un ejemplo en el que queremos imprimir algún mensaje dependiendo de en qué rango se encuentre un valor.

case capacitywhen 0 "You ran out of gas."when 1..20 "The tank is almost empty. Quickly, find a gas station!"when 21..70 "You should be ok for now."when 71..100 "The tank is almost full."else "Error: capacity has an invalid value (#{capacity})"end

Creo que este código es bastante elegante comparado con lo que sería la versión if / elsif.

Caso Ruby & Regex

También puedes utilizar expresiones regulares como tu when condición. En el siguiente ejemplo tenemos un serial_code con una letra inicial que nos dice lo arriesgado que es consumir este producto.

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Cuándo no usar el caso Ruby

Cuando tienes un simple mapeo 1:1, puedes estar tentado de hacer algo como esto.

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

En mi opinión sería mejor hacer esto en su lugar:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

La solución del hash es más eficiente y fácil de trabajar. ¿No crees?

Cómo funciona case: el método ===

Tal vez te preguntes cómo funciona case bajo el capó. Si volvemos a nuestro primer ejemplo, esto es lo que ocurre:

(1..20) === capacity(21..70) === capacity(71..100) === capacity

Como puedes ver, la condición se invierte porque Ruby llama a === en el objeto de la izquierda. El === es sólo un método que puede ser implementado por cualquier clase. En este caso, Range implementa este método devolviendo true sólo si el valor se encuentra dentro del rango.

Así es como se implementa === en Rubinius (para la clase Range):

def ===(value) include?(value)end

Fuente: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

Otra clase interesante que implementa === es la clase Proc.

Post relacionado: Aprende más sobre procs & lambdas.

En este ejemplo defino dos procs, uno para comprobar un even número, y otro para odd.

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

Esto es lo que realmente ocurre:

odd.===(number)even.===(number)

Usar === en un proc tiene el mismo efecto que usar call.

Conclusión

Has aprendido cómo funciona la sentencia case de Ruby y lo flexible que puede ser. Ahora te toca empezar a sacarle el máximo partido en tus propios proyectos.

¡Espero que te haya resultado útil este artículo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *