Condiciones en Ruby
SOLUCIONARIO
Condiciones en Ruby
2024-10-19
Por
Occam's Razor

#!/usr/bin/ruby

N = 42
print "Adivina en que número estoy pensando ? "
v = gets.to_i

abort "Solo números positivos" if v < 0

if v == N
  puts "Bien Hecho!"
else
  print "Sigue Probando!\nEl número es ", (v < N) ? "MAYOR" : "MENOR", "\n"
  # Si hemos fallado añadimos una pista
  h = (v-N).abs
  print "PISTA : "
  if    h < 5  then puts ("TE QUEMAS!!!")
  elsif h < 10 then puts ("CALIENTE") 
  elsif h < 15 ;    puts ("TEMPLADO") 
  else         ;    puts "FRIO" end
end

Ruby es muy completo en lo que a expresiones condicionales se refiere. Nos proporciona un operador ternario ala C/Perl y construcciones if-elsif-else ala Perl-Python. También nos permite definir condicionales de una línea al estilo Perl y al estilo Python… Vamos todas las opciones que se nos puedan ocurrir.

Ruby no necesita que encerremos nuestras condiciones entre paréntesis, si bien, no hay ningún problema en que lo hagáis. En ese caso, como sucede con Python, es un operador más para forzar la precedencia de la operación lógica a realizar.

SABIAS QUE…

Ruby es un lenguaje orientado a objetos propiamente dicho. Esto significa que todo en Ruby es un objeto. No os parece extraña la forma de invocar la función abs. Claro, por que realmente se trata de un método de la clase Numeric.

Las variables v y n contienen realmente objetos de la clase Numeric. Al restarlos estamos obteniendo un nuevo objeto de la misma clase y como esa clase define un método abs… pues simplemente lo llamamos. En Ruby podemos escribir cosas como:

-55.abs

Como podéis ver, cuando escribimos las instrucción if, elsif o else en una sola línea, debemos separar la condición de la instrucción a ejecutar, ya sea utilizando la palabra clave then o el caracter ;.

En el programa de ejemplo, observad el end al final de la última linea. Este end termina el bloque iniciado con el primer if. De la misma forma, el bloque interno en el que encadenamos varios ifs para mostrar la pista, sigue la misma estructura, solo que el end final lo hemos escrito en la misma línea que el else.

SOY NOVATO

Quizás te haya llamado la atención la línea

v = gets.to_i

Este encadenamiento de métodos es común en lenguajes fuertemente orientados a objetos como Ruby. Es también habitual verlo en Python y Java. Veámos lo que está pasando.

El método gets retorna un objeto de tipo string. Este objeto string proporciona un método to_i, el cual genera un nuevo objeto de tipo numérico inicializado con el valor contenido en la cadena.

Veremos muchas más construcciones como esta en los siguientes capítulos

Ruby ofrece una variante de la instrucción switch más potente que la que nos proporciona el lenguaje C y derivados, permitiendonos utilizar cadenas, rangos o incluso expresiones regulares.

case variable
    when NUMERO..NUMERO then codigo
    when /regex/
         codigo
    when Clase1, Clase2
         codigo
    when "Cadena"
        codigo
    else
        print "Valor por defecto"
end  

La sintaxis es muy parecida a la de la instrucción switch de C, pero utilizando distintas palabras clave y permitiéndonos utilizar expresiones mucho más complejas para los casos. El código asociado a cada caso se puede incluir en la línea siguiente o en la misma línea. En este último caso debemos utilizar la palabra clave then.

El caso por defecto se maneja en la clausura else. La generación de la pista en nuestro programa de ejemplo se podría haber escrito de la siguiente forma:

  case h
    when 1..5   then puts ("TE QUEMAS!!!")
    when 6..10  then puts ("CALIENTE")
    when 11..15 then puts ("TEMPLADO")
    else             puts ("FRIO")
  end
Ruby ofrece dos formas para generar rangos: `..` y `...`. La diferencia entre uno y otro es que el primero `..` incluye el elemento final del rango y `...` lo excluye. Así `1..5` genera un rango desde `1` hasta `5` ambos inclusibles, pero `1...5` genera un rango que no incluye el valor 5.

Las constantes en Ruby son simplemente variables cuyo nombre empieza por mayúsculas. Sin embargo, a diferencia de otros lenguajes como Perl y Python, Ruby realmente considera esas variables de una forma especial. Ruby permite volver a asignar un valor a una constante, pero emitirá un aviso (warning) cuando lo intentemos hacer.

Hay algunas salvedades más respecto del uso de constantes en Ruby, pero la más importante es que no se pueden declarar constantes dentro de métodos o funciones, pero si dentro de clases.

En nuestro ejemplo el número N que debemos adivinar lo hemos nombrado con mayúsculas y por tanto será una constante. Puedes cambiar su valor, pero un mensaje de advertencia será mostrado en pantalla.

Resumen

  • Soporta if ... [elsif] ...[else] ...
  • Soporta operador terciario (cond) ? valor_Verdad : Valor_Falso
  • No soporta booleanos pero define valores true y false
  • No soporta switch: case variable ... when pattern .. else
  • Soporta constantes. Solo declara una variable en mayúsculas

Interesado en aprender Ruby

A través de nuestra cuenta del Programa de Afiliados de Amazon, te recomendamos este libro:

Pragmatic Programmer, The: Your journey to mastery, 20th Anniversary Edition.

Como parte de este programa, recibimos una comisión por compras realizadas utilizando este enlace.


SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)