

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 scene
si no estás familiarizado con la sentenciacase
y 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à!