Author Archives: Uriel

About Uriel

Programador en constante aprendizaje, futuro ing. en Desarrollo de Software. "La escuela es para socializar, internet es para aprender" Viviendo en la era javaScript.

Ciclo While en Ruby

Una vez nos hemos adentrado en los ciclos no podemos olvidarnos de uno de los más utilizados, el ciclo While, de nuevo, si no has programado antes, necesitas saber que ésta es una especie de ciclo que se repite mientras una condición se cumple.

La sintaxis del ciclo while en Ruby es bastante parecida a la de otros lenguajes, veamos el ejemplo:

it = 1
while i < 10
   puts it
   it += 1
end

El ciclo anterior irá de 1 a 9, cómo verás, entra al ciclo siempre y cuando la condición que se encuentra al lado de la palabra while se cumple, en este caso i<10.

Bastante sencillo ¿no? Lo interesante será combinarlo con valores que el usuario ingrese, ya que generalmente, éste ciclo se utiliza cuando no sabemos cuántas veces se necesitará repetir un bloque de código.

Cabe recalcar que las palabras que modifican un ciclo for también aplican para el ciclo while, éstas son redobreaknext, si necesitas saber más al respecto revisa el artículo anterior de éste curso.

Por ahora todo ha sido muy común, cosa extraña pensando que Ruby es uno de los lenguajes con sintaxis más peculiar, éste artículo también presenta una variante interesante del ciclo while, peculiar de Ruby, y es el ciclo until.

Until, se trata del inverso de while, es decir, un ciclo que se ejecuta siempre y cuando la condición sea FALSA, veamos el ejemplo anterior pero usando ahora until:

it = 1
until i > 9
   puts it
   it += 1
end

De nuevo el ciclo iterará de 1 a 9, nota cómo cambiamos el operador < por el >, es decir el inverso, de modo que el ciclo se itera siempre y cuando i no sea mayor que 9.

Algunos conocedores se estarán preguntando, qué pasa con la variante do… while, en Ruby no hay algo como tal, pero bien se puede hacer uno basado en el poder de los bloques, veamos el ejemplo:

it = 1
begin
   puts it
   it += 1
end while i < 10

En el caso anterior, el bloque encerrado por las palabras reservadas begin end, se ejecuta una vez, posteriormente evalúa la condición y decide si debe repetirse de nuevo.

Bien, con esto terminamos el análisis de los ciclos, en el siguiente artículo veremos entrada y salida de datos con Ruby.

Ciclo for en Ruby.

Si éste es tu primer acercamiento a la programación, necesitas saber que un ciclo es un bloque de instrucciones que se repite un número definido de veces, existen diferentes tipos de ellos y uno de los más comunes es el ciclo for.

El ciclo for en Ruby, permite que nosotros definamos un rango entre el cual, un iterador, se irá moviendo, sirve para repetir un proceso un determinado número de veces tomando un iterador como referencia entre éstas veces. Si lo anterior no te quedó muy claro, es porque necesitamos un ejemplo:

for i in(0..9)
    puts i
end

Como ves, la sintaxis es clara y muy sencilla, tenemos un iterador  y un rango 0..9, lo que significa que el iterador iniciará el ciclo siendo igual a nueve e irá aumentando de uno en uno hasta llegar al 9, cada vez que aumenta entra al bloque de instrucciones, éste bloque lo único que hace en el ejmplo es imprimir el valor del iterador i.

Existen un grupo de palabras reservadas que tienen la capacidad de modificar el comportamiento de un ciclo, la primera que veremos es break y lo que hace es sacar el ciclo, es decir, sin importar en qué parte del rango se encuentre el iterador, el ciclo se terminará una vez haya encontrado la palabra break, veamos un ejemplo:

for i in(0..9)
    if(i == 3) break end
    puts i
end

En el ejemplo anterior, una vez el ciclo valga 3, se terminará y ya no recorrerá hacia el 4.

La siguiente palabra es next y lo que hace es sencillamente saltar la interación en la que se encuentra y pasar a la siguiente.

for i in(0..9)
    if(i == 3) next end
    puts i
end

De modo que si tu probaras el ejemplo anterior, notarías que el 3 no aparece en la consola, y la razón es que saltamos esa iteración a través de la palabra reservada next.

Por último tenemos una con la que querrás tener mucho cuidado, y es redo, y lo que hace es sencillamente repetir la iteración, es decir, lo contrario a next.

for i in(0..9)
    puts i
    if(i == 3) redo end
end

Como te mencionaba, ten cuidado, puesto que el ejemplo anterior se ciclará imprimiendo 3 una y otra vez porque redo le está pidiendo que repita la iteración.

Sé que quedarás con dudas como por ejemplo, qué pasaría si quiero aumentar de 2 en 2, en lugar de 1 en 1. Bien eso lo veremos en otros tipos de ciclos más Rubyanos (si existiera esa palabra) que el for.

Sentencia Case en Ruby.

La instrucción case en Ruby es una que me gusta mucho, sería el similar de la instrucción switch en otros lenguajes, pero a mi parecer está estructurada de una forma más legible.

Supongamos que queremos evaluar si una persona puede o no entrar a una película basándonos en su edad, bien, según Wikipedia si la película es clasificación G todos pueden entrar, PG-13 menores de 13 años con padres, R menores de 17 años con padres y NC-17 sólo mayores de edad, ¿cómo podríamos escribir un programa así en Ruby?

Si dominas la instrucción if bien podrías pensar en algo como lo siguiente.

if c == "G"
      print "Todos entran"
elsif c == "PG-13"
      print "Si eres menor de 13 años necesitas un adulto" 
elsif c == "R"
      print "Si eres menor de 17 años necesitas un adulto" 
elsif c == "NC-17"
      print "Solo mayores de 17 entran." 
end

Lo anterior solucionaría el problema, suponiendo que la variable c almacena la categoría de la película a la que se quieren entrar, la solución la enfrentamos haciendo uso de if’s anidados esto significa que si el primer if no es verdadero evaluará el siguiente elsif y así sucesivamente.

Ahora bien, aunque solucionamos el problema, queda claro que no es la mejor forma de enfrentarlo, dada la cantidad de código que hemos repetido. En estos casos, podríamos implementar un case, como en el siguiente ejemplo:

clasificacion = "G"

disponibilidad = case car
   when "G" then "Todos pueden entrar"
   when "PG-13" then "Menores de 13 con un adulto"
   when "R" then "Menores de 17 con adulto"
   when "NC-17" then "Solo mayores de edad"
   else "Error en la clasificacion"
end
print disponibilidad

Como mencionaba antes, a mi parecer, la instrucción es clara por sí sola, almacenas en una variable el resultado del case y evalúas cada posibilidad con un when, la palabra reservada then define que valor se guardará en la variable en caso de que se haya cumplido la condición.

Ahora bien, en el caso anterior vimos un ejemplo evaluando cadenas, sin embargo, la instrucción case también evalúa números y rangos, veámoslo en un ejemplo:

calificacion = 9

resultado = case calificacion
   when 0..5 then "Reprobaste"
   when 6..7 then "Apenas pasaste"
   when 8..9 then "Buen trabajo!"
   when 10 then "Excelente"
   else "Error en la calificacion recibida"
end

puts resultado

Y así de sencillo es como acomodamos la instrucción a números.

Con esto terminamos el análisis de la instrucción case y pasaremos en los siguientes artículos a ver cosas relacionadas con los ciclos.

If – Unless en Ruby.

Definitivamente si has programado en otros lenguajes estarás familiarizado con la sentencia if, sin embargo, la instrucción unless probablemente te parezca interesante así que te invito a seguir leyendo el artículo.

La instrucción if permite evaluar una operación lógica y en base al resultado ejecutar ciertas instrucciones u otras, en la vida real es como tomar una decisión y elegir entre dos caminos.

La estructura de la sentencia if es la siguiente:

 if condicion
   #Conjunto de instrucciones a realizar
 end

Donde como sabes, “condicion” será reemplazado con una operación lógica, y el comentario “#Conjunto de instr…” se reemplazará con las sentencias de código que quieras que se ejecuten si se cumple la condición.

Los lenguajes de programación dan la facilidad de también ejecutar algo si la condición no se cumple, esto a través de la instrucción else. Veamos la estructura:

if condicion
   #Se cumplio la condicion
else
   #No se cumplio la condicion
end

Como verás, en este caso sustituyes el comentario “No se cumplio…” por las instrucciones de código a ejecutar si no se cumple la condición.

Unless.

En programación como en matemáticas existe el operador ! o NOT, que básicamente invierte la respuesta de una operación lógica, es decir, si la operación es verdadera la vuelve falsa y si es falsa la vuelve verdadera, este operador se utiliza mucho cuando queremos que se ejecuten instrucciones cuando NO se cumpla una condición, ejemplo:

if not div == 0
 puts 5/div
end

En el ejemplo anterior evaluamos que el valor entre el que dividimos no sea 0, para que no mande un error, y para ello utilizamos el operador NOT. Todo esto se menciona porque en Ruby existe la instrucción UNLESS, que literalmente cumple la función del operador NOT, veamos el mismo ejemplo anterior.

unless div == 0
 puts 5/div
end

Unless ejecuta las instrucciones si la condición es falsa, literalmente dice ejecuta esto A MENOS QUE esta condición sea verdadera, a mi parecer bastante práctico y más claro.

Con esto concluimos este artículo, en el siguiente hablaremos de la sentencia case.