#!/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
endRuby 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 claseNumeric.Las variables
vyncontienen realmente objetos de la claseNumeric. Al restarlos estamos obteniendo un nuevo objeto de la misma clase y como esa clase define un métodoabs… 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_iEste 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
getsretorna un objeto de tipostring. Este objetostringproporciona un métodoto_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")
endRuby 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.■
