Mostrando categoría Ruby
Dec 22

Ruby ofrece estructuras condicionales o de control como if/else, case(switch) y otras que vere en esta entrada.

Declaracion if

Un bloque de codigo dado es ejecutado solo si la condicion es verdadera(true).

if condicion
   # codigo a ejecutar si la condicion es verdadera
end

Por ejemplo:

edad = 23
if edad >= 18
   puts "Mayor de edad."
end
Mayor de edad.

En ruby es considerado verdadero todo aquello que no sea false o nil.

Declaracion if…else

Se puede definir un bloque de codigo a ser ejecutado cuando la condicion no se cumpla usando else(si no):

if condicion
   # codigo a ejecutar si la condicion es verdadera
else
   # codigo a ejecutar si la condicion es falsa
end

Por ejemplo:

edad = 15
if edad >= 18
   puts "Mayor de edad."
else
   puts "Menor de edad."
end
Menor de edad.

Declaracion if…elsif…else

Mediante el uso de elsif podemos agregar condiciones con su respectivo bloque de codigo:

if condicion1
   # codigo a ejecutar si condicion1 es verdadera
elsif condicion2
   # codigo a ejecutar si condicion 1 es falsa y condicion2 verdadera
else
   # codigo si ninguna de las condiciones anteriores era verdadera
end

Por ejemplo:

idioma = "es"
if idioma == "en"
   puts "Welcome to my website."
elsif idioma == "es"
   puts "Bienvenido a mi sitio."
else
   puts "Idioma desconocido."
end
Bienvenido a mi sitio.

Ojo que es elsif y NO elseif como se podria esperar.

Otra cosa importante a notar es que se puede separar la condicion del codigo a ejecutar de tres formas diferentes, con una nueva linea como en los ejemplos, mediante el uso de la palabra clave then(entonces) luego de la condicion, o usando punto y coma.

idioma = "es"
if idioma == "en" then puts "Welcome to my website."
elsif idioma == "es" then puts "Bienvenido a mi sitio."
else puts "Idioma desconocido." end

La esctructura que obtenemos es “si (condicion) entonces (codigo)“. Como else no requiere condicion, se puede escribir el codigo junto sin necesidad de usar un separador, y el end tambien se puede agregar en la misma linea.

Y luego el tercer caso usando punto y coma.

idioma = "es"
if idioma == "en" ; puts "Welcome to my website."
elsif idioma == "es" ; puts "Bienvenido a mi sitio."
else puts "Idioma desconocido." end

Como nota, el uso de punto y coma en general se puede utilizar para escribir multiples lineas en una sola, por ejemplo:

numero = 12 ; puts "El numero es #{numero}"
El numero es 12

Declaracion unless

Esta declaracion que significa “a menos que” ejecuta un bloque de codigo si la condicion es falsa o nil.

unless condicion
   # codigo a ejecutar si la condicion es falsa o nil
end

Por ejemplo:

edad = 15
unless edad > 18
   puts "No puedes acceder a este sitio para mayores."
end
No puedes acceder a este sitio para mayores.

Declaracion unless…else

Asi como if, unless tambien dispone de else.

unless condicion
   # codigo a ejecutar si la condicion es falsa o nil
else
   # codigo a ejecutar si la condicion es verdadera
end

Por ejemplo:

edad = 20
unless edad > 18
   puts "No puedes acceder a este sitio para mayores."
else
   puts "Bienvenido al sitio."
end
Bienvenido al sitio.

Modificadores para if y unless

Ruby dispone de los llamados “modifiers” que permiten mover la estructura de control al final de la expresion, en esta entrada solo vere los modificadores de if y unless pero tambien hay para while y until, veamos la estructura.

codigo if condicion

La idea con if sigue siendo la misma, ejecutar el “codigo” si la condicion es verdadera, por ejemplo:

puntaje = 75
puts 'Aprobado.' if puntaje >= 60
Aprobado.

Para unless seria:

puntaje = 75
puts 'Aprobado.' unless puntaje < 60
Aprobado.

Esto nos permite poner el codigo de una forma un poco mas leible, este ultimo ejemplo se podria leer como “Escribir Aprobado a menos que el puntaje sea menor a 60″.

Declaracion case

Esta nos permite probar “casos” al comparar la expresion dada en “case” con las expresiones dadas en “when” y luego ejecutando el codigo correspondiente. En caso que ningun caso coincida se ejecuta el bloque de codigo bajo else:

case expr0
when expr1, expr2
   # codigo a ejecutar si expr0 coindice con expr1 o expr2
when expr3
   # codigo a ejecutar si expr0 coincide con expr3
else
   # codigo a ejecutar si no coindice con ningun caso
end

Por ejemplo:

puntaje = 75
case puntaje
when 100
   puts "Puntaje perfecto"
when 80..100
   puts "Excelente"
when 60..80
   puts "Aprobado"
else
   puts "Reprobado"
end
Aprobado

En este ejemplo hay 3 casos definidos ademas del else, el primero compara “puntaje” con el valor 100, el siguiente con el rango de 80 a 100 y el tercero con el rango de 60 a 80. Cabe mencionar que cuando un when es exitoso los demas casos no son evaluados.

Tambien aprovecho de mencionar que al igual que en la estructura if, la expresion puede ser separada del codigo mediante una linea nueva, la palabra clave then o un punto y coma.

Operador ternario

Ruby tambien cuenta con el operador ternario que nos provee de un atajo para tomar decisiones, la estructura es la siguiente:

( condicion ) ? expresion si verdadero : expresion si falso

La condicion es evaluada y devuelve “expresion si verdadero” cuando es verdadera y “expresion si falso” cuando es falsa, veamos un ejemplo:

edad = 17
puts ( edad >= 18 ) ? "Es mayor" : "No es mayor"
No es mayor

El parentesis no es obligacion. Al evaluar “edad >=18″ que resulta ser verdadero el operador ternario devuelve “Es mayor”, esto lo muestro en pantalla anteponiendo el metodo puts, tambien podria almacenar el resultado en una variable como:

edad = 17
es_o_no = ( edad >= 18 ) ? "Es mayor" : "No es mayor"
puts es_o_no

Que daria el mismo resultado, y asi acaba esta entrada.

etiquetas: , , , , , , ,

Dec 18

En Ruby un array es una coleccion de referencias a objetos, la referencia se hace mediante un indice numerico entero. Comencemos viendo como crear un array.

Crear un array

Una de las formas de crear un Array en Ruby es usar square brackets(los corchetes), simplemente ponemos los elementos separados por coma(si es mas de uno):

lista1 = [ ] # array vacio
lista2 = [ 1, 3, 5, 7, 11 ] # array con elementos tipo Fixnum
lista3 = [ 8, 'manzana', 3.14 ] # con distintos tipos de objetos (Fixnum, String, Float)
p lista1, lista2, lista3 # uso 'p' en vez de 'puts' para inspeccionar
[]
[1, 3, 5, 7, 11]
[8, "manzana", 3.14]

Otra forma es usando Array.new:

lista1 = Array.new # array vacio
lista2 = Array.new(5) # array con 5 elementos
lista3 = Array.new(3, 'test') # array con 3 elementos
p lista1, lista2, lista3
[]
[nil, nil, nil, nil, nil]
["test", "test", "test"]

Aca pueden notar que por defecto el array lista2 se llena de objetos nil ya que no se le ha dado un valor por defecto como en lista3.

Tambien existe un atajo para crear un array con valores tipo String, por ejemplo:

colores1 = [ 'rojo', 'verde', 'azul', 'amarillo' ] # usando brackets
colores2 = %w{ rojo verde azul amarillo } # usando el atajo %w
p colores1, colores2
["rojo", "verde", "azul", "amarillo"]
["rojo", "verde", "azul", "amarillo"]

Como ven son equivalentes, este atajo nos ahorra la tediosa tarea de escribir las comillas para cada elemento.

Cantidad de elementos en un array

Para conocer la cantidad de elementos en un array tenemos dos metodos, size y length:

nada = []
nums = [1, 3, 5, 7]
puts nada.size, nums.size # tambien puedo usar 'length'
0
4

Acceder a los objetos

Para acceder a un elemento en particular se puede hacer mediante su indice, en ruby los indices parten desde 0:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
puts colores[0] # el indice 0 corresponde al primer elemento
puts colores[3] # por tanto el indice 3  corresponde al ultimo elemento
# al usar un indice negativo se cuenta desde el final
puts colores[-1] # el ultimo elemento
puts colores[-2] # el penultimo
rojo
cafe
cafe
verde

Tambien es posible acceder usando el formato [inicio, cantidad] como se muestra:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0,2] # desde el indice 0 mostrar 2
p colores[1,3] # desde el indice 1 mostrar 3
p colores[-2,2] # desde el penultimo mostrar 2
["rojo", "azul"]
["azul", "verde", "cafe"]
["verde", "cafe"]

Una tercera forma es usando rangos, [desde..hasta] o [desde...hasta], por si no se nota la diferencia es un punto. Al usar tres puntos, se excluye al ultimo elemento:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0..2] # desde elemento con indice 0 al con indice 2(incluido)
p colores[0...2] # desde elemento con indice 0 al con indice 2(excluido)
# tambien se pueden usar numeros negativos aqui
p colores[-2..-1] # del penultimo al ultimo(incluido)
p colores[0...-1] # del primero al ultimo(excluido)
["rojo", "azul", "verde"]
["rojo", "azul"]
["verde", "cafe"]
["rojo", "azul", "verde"]

Y una forma mas es el uso de los metodos first y last:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores.first # el primero
p colores.first(3) # los primeros 3
p colores.last # el ultimo
p colores.last(2) # los ultimos 2
"rojo"
["rojo", "azul", "verde"]
"cafe"
["verde", "cafe"]

Modificar los objetos

Para modificar un valor en particular:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[2] = 'naranja' # cambio el tercer valor
colores[-1] = 'amarillo' # y el ultimo
p colores
["rojo", "azul", "naranja", "amarillo"]

Tambien puedo usar el mismo formato [indice, largo] para modificar el array:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = 'naranja' # dos elementos a partir del indice 1
p colores
["rojo", "naranja", "cafe"]

Pueden notar que en este caso se redujo el tamaño del array, esto es porque indique que los dos valores a partir del indice 1 se vieran reemplazados por un solo valor ‘naranja’, si quisiera mantener la cantidad deberia usar un array como en el siguiente ejemplo:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo']
p colores
["rojo", "naranja", "amarillo", "cafe"]

Ahora si los dos valores centrales fueron reemplazados por dos nuevos valores. Tambien se podria incrementar el tamaño del array si se quiere:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo', 'gris']
p colores
["rojo", "naranja", "amarillo", "gris", "cafe"]

En este caso indique que los dos valores a partir del indice 1 se vieran reemplazados por 3 valores nuevos, esto hizo que el valor ‘cafe’ se desplazara una posicion a la derecha aumentando el tamaño del array.

Esto mismo se puede hacer con los rangos vistos antes, por ejemplo:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[0..2] = ['naranja', 'amarillo', 'gris']
p colores
["naranja", "amarillo", "gris", "cafe"]

Aqui el rango indica modificar los primeros tres valores(indices 0 a 2) por tres nuevos valores, por lo que el tamaño del array queda intacto.

Array como una pila (stack, LIFO)

Existen dos metodos que permiten agregar y eliminar elementos desde el final de un array, estos son push y pop respectivamente, veamos un ejemplo:

pila = [] # comienzo con un array vacio
pila.push 'uno'
pila.push 'dos'
pila.push 'tres'
p colores # a esta altura tiene 3 elementos
puts pila.pop # voy quitando desde el ultimo
puts pila.pop
puts pila.pop
p colores
["uno", "dos", "tres"]
tres
dos
uno
[]

El array que comenzo vacio termino vacio debido a que use el metodo pop tres veces, utilize puts para verificar el elemento que es eliminado cada vez que utilizo pop.

Arrays como una cola (queue FIFO)

Tambien existen dos metodos para agregar y remover desde el inicio de un array, estos son unshift y shift, veamos un ejemplo:

colores = [] # comienzo con un array vacio
colores.unshift 'azul'
colores.unshift 'verde'
colores.unshift 'rojo'
p colores # a esta altura tiene 3 elementos
puts colores.shift # voy quitando el primero
puts colores.shift
puts colores.shift
p colores
["rojo", "verde", "azul"]
rojo
verde
azul
[]

Como ven el array resultante es inverso al del ejemplo anterior, pues los nuevos elementos son agregados al inicio del array.

Ahora, para obtener el comportamiento de una cola(queue) es necesario combinar push que agrega los elemento al final y shift que elimina desde el inicio:

cola = []
cola.push 'cliente1'
cola.push 'cliente2'
cola.push 'cliente3'
p cola # el que llego ultimo queda al ultimo
puts cola.shift # el que llego primero se va primero
puts cola.shift
puts cola.shift
p cola
["cliente1", "cliente2", "cliente3"]
cliente1
cliente2
cliente3
[]

Eso seria por esta entrada, para saber mas sobre arrays pueden visitar la documentacion sobre Arrays para Ruby 1.9.

Nov 27

El editor de texto por defecto para el escritorio gnome (GNU/Linux) llamado gedit tiene un plugin llamado ‘External Tools’ que permite ejecutar comandos externos y shell scripts, estaba buscando algun tool que con apretar una tecla ejecutara el codigo Ruby (asi como el F5 en el editor Geany) pero no encontre, por lo que investigue un poco e hice uno:

#!/bin/sh
FILE="gedit_${GEDIT_CURRENT_DOCUMENT_NAME}~"
sed '$s/$/\ngets/'  > $FILE
gnome-terminal  --command="ruby ${FILE}"
Input: Current document
Output: Display in bottom panel
Applicability: All documents

Lo que hace es copiar el texto actual del documento (inclusive lo que no se ha guardado) mas una nueva linea y un gets a un documento oculto que comienza con gedit_, luego ejecuta ese documento en la consola.

Ahi lo dejo por si alguien usa gedit para practicar Ruby, saludos..

etiquetas: , ,

Nov 27

Los metodos son subrutinas asociadas a clases o objetos, ’similares’ a lo que se conoce como funciones en otros lenguajes.

Metodo simple sin parametros

La estructura es como sigue:

def nombre_metodo
   # codigo
end
nombre_metodo #Aqui estaria llamando el metodo

Por ejemplo:

def saludar
   puts 'Hola que tal'
end
saludar # no es obligacion usar parentesis, ej: saludar()
Hola que tal

Metodo simple con parametros

Se puede definir un metodo que acepte parametros de la siguiente forma:

def sumar(a, b)
   puts "La suma es #{a + b}."
end
sumar(2, 3)
La suma es 5.

Aca tampoco son obligacion los parentesis tanto en la definicion del metodo como al llamarlo, se podria escribir:

def sumar a, b
   puts "La suma es #{a + b}."
end
sumar 2, 3

Valor de retorno

Los metodos devuelven el valor de la ultima expresion evaluada, por ejemplo:

def sumar(a, b)
   a + b
end
puts sumar(2, 3) # uso puts para mostrar el valor de retorno del metodo
var = sumar(5, 4) # var valdra 9
5

Es posible poner de forma explicita el retorno usando ‘return’:

def sumar(a, b)
   return a + b
end
puts sumar(2, 4)

Incluso hacer que el metodo devuelva multiples valores,

def sumar(a, b)
   suma = a + b
   return a, b, suma
end
puts sumar(2, 4)
2
4
6

Uso de parentesis al utilizar el valor de retorno

Cuando queramos utilizar de inmediato el valor de retorno de un metodo, es necesario el uso de parentesis, por ejemplo:

def saludar(nombre)
   "hola #{nombre}!"
end
puts saludar('visitante').upcase #aca upcase se aplica al resultado del metodo
HOLA VISITANTE!

Si no usara parentesis:

def saludar(nombre)
   "hola #{nombre}!"
end
puts saludar 'visitante'.upcase #aca se aplica a 'visitante' y no al retorno
hola VISITANTE!

Definir valores por defecto

Podemos definir valores por defecto para algunos parametros:

def mostrar(var1, var2 = 'valor2', var3 = 'valor3')
   puts "#{var1}, #{var2}, #{var3}"
end
mostrar('a', 'b', 'c') # paso todos los valores
mostrar('hola') # paso solo 1
a, b, c
hola, valor2, valor3

Aquellos parametros que tengan valores por defecto deben ir todos a un mismo lado, en el ejemplo todos a la derecha.

Numero de argumentos variables

El ultimo (o unico) parametro de un metodo puede ir precedido de un asterisco(*) para indicar que mas parametros seran pasados. Estos parametros son almacenados en un array(lista), por ejemplo:

def cuantos(*nums)
   nums
end
p cuantos(38, 45, 23) # uso p en vez de puts para que se note el array
[38, 45, 23]

Otro ejemplo:

def cuantos(a, b, *otros)
   p otros
   puts a, b, otros.size
end
cuantos(38, 45, 23, 12, 28, 34)
[12, 28, 34]
38
45
4

Si queremos pasar los valores de un array como parametros podemos hacerlo asi:

def cuantos(a, b, *otros)
   p a, b, otros
end
lista = [3, 4, 5, 6, 7, 8]
cuantos(*lista)
3
4
[5, 6, 7, 8]

Al usar el * delante del nombre del array este es expandido y sus valores son pasados como si estuvieran separados por una coma, de esta forma los dos primeros valores son asignados a ‘a’ y ‘b’ respectivamente y el resto a ‘otros’.

The end~

Oct 07

En este post revisare algunos elementos basicos del lenguaje, partiendo con el metodo puts , veamos el siguiente ejemplo:

puts 'hola mundo'

Como resultado obtenemos:

hola mundo

Como ven en una sola linea y de forma sencilla podemos mostrar un mensaje utilizando el metodo puts. Tambien podemos interpolar variables en medio de un puts de la siguiente forma:

color = 'verde' # asignar una variable es asi de simple
puts "Una manzana #{color}"
Una manzana verde

Lo primero que notaran es el uso de #{}. Dentro de los parentesis podemos no solo poner variables sino ademas expresiones para que sean evaluadas, por ejemplo:

puts "Hay #{24*60} minutos en un dia."
Hay 1440 minutos en un dia.

Que tal el siguiente ejemplo:

minutos = 1440 # variable numeria no requiere  comillas
puts "Hay #{minutos*60} segundos en un dia."
Hay 86400 segundos en un dia

Pero para que #{} funcione, debe estar dentro de comillas dobles. Entre comillas simples no podemos incluir variables, veamos que sucede:

color1 = 'azul'
color2 = 'blancas'
puts "El cielo es #{color1}" #con doble comillas
puts 'Y las nubes #{color2}' #con comilla simple
El cierlo es azul
Y las nubes #{color2}

Como ven la expresion #{color2} es mostrada tal cual.

En cuanto a la asignacion de variables, en ruby podemos hacer mas de una asignacion en una sola linea separando las variables con coma, por ejemplo:

color, numero = 'azul', 5
puts "Mi color favorito es #{color}, y mi numero el #{numero}"
Mi color favorito es azul, y mi numero el 5

Esto se puede hacer con mas variables, basta con cuidar el orden en que definimos las variables y ponemos los valores correspondientes.

Otro elemento interesante de las asignaciones es que si dos o mas variables fueran a compartir un valor inicial, podemos hacer:

a = b = 5  # aqui tanto 'a' como 'b' valen 5
b += 3  # otra forma de escribir 'b = b + 5'
puts a
puts b
5
8

Veamos un ejemplo mas, a ver como andan en matematicas:

a = b = c = d = 100
a += 10 # como a = a + 10
b -= 30 # como b = b - 30
c *= 2 # como c = c * 2
d /= 20 # como d = d / 20
puts a, b, c, d  #paso multiples parametros a puts
110
70
200
5

Se fijan que en la ultima linea, en vez de escribir un puts por cada variable, use solo uno y le pase las variables como parametros separados por coma, un ejemplo mas de esto:

color = 'verde'
numero = 8
puts 'hola', color, numero, 15
hola
verde
8
15

Ya solo me queda una cosa mas que quisiera revisar en este post y es la concatenacion. Concatenar es enlazar elementos juntos, por ejemplo textos:

# una opcion es usando el metodo +
puts 'Esto se vera' + ' en una sola ' + 'linea'

# tambien podemos usar el metodo <<
puts 'Esto tambien' << ' se vera como ' << 'una sola linea'

# incluso podemos dejar vacio en medio
puts 'Increible pero' ' esto tambien ' 'resulta'
Esto se vera en una sola linea
Esto tambien se vera como una linea
Increible pero esto tambien resulta

En estos casos no parece muy practico usar concatenacion, pero toma mas sentido cuando lo mezclamos con variables, por ejemplo:

color = 'verde'
puts "Una manzana #{color}" # asi lo hice originalmente
puts 'Una manzana ' + color # usando concatenacion
Una manzana verde
Una manzana verde

En el segundo puts tambien podria usar comillas dobles, pero como no evaluare nada dentro del texto me basta con comillas simples.

Veamos un ejemplo mas:

pais, idioma = 'Brasil', 'Portugues'
puts 'En ' + pais + ' se habla ' + idioma
En Brasil se habla Portugues

Con numeros no es exactamente igual, si hiciera por ejemplo

num = 8
puts 'Mi numero de la suerte es el ' + num

Recibira el siguiente error:

TypeError: can't convert Fixnum into String

Un error de tipo de dato pues estoy intentando juntar num que es numero(Fixnum) a un texto(String). Pero esto tiene una solucion sencilla que es el uso del metodo to_s (to string):

num = 8
puts 'Mi numero de la suerte es el ' + num.to_s
Mi numero de la suerte es el 8

Y ahora si, eso seria por esta entrada.

etiquetas: ,