
En este artículo, vamos a explorar los siguientes temas:
- El operador
.. - El operador …
- Rangos y valores flotantes
No dudes en libre de leer el artículo
Case statement behind the scenesi no estás familiarizado con la sentenciacasey la cláusulawhen.
Antes de empezar
Estoy encantado de compartir con vosotros nuestro último proyecto: Fun Facts about Ruby – Volume 1
¡Por favor, no dudes en difundirlo y compartir este post! 🙏
¡Gracias por tu tiempo!
En una sentencia case las cláusulas when pueden tomar un rango como parámetro
Aquí, la sentencia case toma un entero como parámetro.
Como la cláusula when toma un rango como parámetro entonces se invoca el operador Range#=== y se comprueba si el entero está incluido en el rango.
El operador .. en nuestro rango asegura que los operandos izquierdo y derecho están incluidos en el rango.
La segunda cláusula when toma un rango usando el operador ….
Esto significa que el operando derecho no está incluido en el rango.
Ahora que estamos más familiarizados con la cláusula when y los rangos, vamos a desglosar un caso límite que me he encontrado usando floats y rangos.
Rango de valores flotantes y la cláusula when
Como hemos visto en el ejemplo anterior, el operador … excluye el operando derecho del rango. Pero, ¿qué pasa si quiero excluir el operando izquierdo?
Aquí, sólo se procesa el contenido de la primera cláusula when que coincide con el valor surface – en nuestro caso when 70..90 then :second_value.
En este caso, la sentencia case devuelve :second_value.
Así que la siguiente cláusula when nunca se evalúa para un surface de 90.
Esto funciona bien para un rango de enteros.
¿Pero qué pasa si tenemos que tratar con un rango de flotantes?
Aquí, la sentencia case devuelve :third_value ya que surface es estrictamente mayor que 130.0.
Si reasignamos surface = 130.0 entonces nuestra sentencia case devuelve :second_value – igual que los rangos de enteros.
Nota que usamos la constante Float::INFINITY para terminar nuestro último rango.
Esto es equivalente a cualquier valor por encima de 130.0.
Por último, echemos un vistazo a la noción de rangos infinitos – Esta noción ha sido introducida en Ruby 2.6.0.
En la línea 6, el rango omite explícitamente el operando derecho.
Ruby interpreta esto como lo siguiente: 130..Float::INFINITY
Esto nos permite evitar llamar implícitamente al para terminar nuestro rango.
Así que aquí, el valor de surface coincide con esta comparación y la sentencia case devuelve :third_value.
¡Voilà!