Está en la página 1de 11

Hola gente, como va todo?

Les traigo la propuesta de este taller, en el que les voy a ir intentando enseñar algo de Ruby, bien desde
0, o mejor dicho, desde -1. Osea que estaria bueno que los que nunca vieron algo de programacion, y
quieran aprender se enganchen con esto, ya que les voy a explicar toooodo como si nunca en su vida
hubieran tocado una PC. Les paso a explicar masomenos como me voy a manejar en el taller, asi se
van haciendo una idea aproximada de como vamos a trabajar. Siempre les voy a explicar que estamos
haciendo, osea, que entinedan lo que hacen uds, porque sino no tiene gracia, o eso me parece a mi,
sino van a terminar copiando y pegando lo que yo haga y lo van a modificar masomenos como para que
ande, y asi no va che! xD 

Bueno... me dejo de vueltas, y empesamos con el.... 

Taller de Ruby  

Primero que nada tienen que saber que es Ruby. 


Ruby es, en lineas generales un lenguaje de programacion orientado a objetos, que es muy sencillo.
Fue diseñado para que sea facil de leer y escribir. No se compila, es por eso que es un lenguaje de
guiones o Scripts que es interpretado por un Interprete (en este caso el interprete de Ruby) para ser
ejecutado en tu computadora. 

Bueno, antes de seguir quiero que vean que es lo que vamos a necesitar por ahora para el taller. 

1) Se van instalando el Ruby para Windows, yo voy atrabajar usando la version disponible
enhttp://rubyforge.org/frs/?group_id=167  yo estoy usando la version 1.8.6-26 Final Release. 

Este paquete (que ya se me estan bajando e instalando) contiene el interprete Ruby y un editor de texto
llamado Scite, entre otras utilidades, sobre los cuales nos vamos a centrar casi totalmente para los
ejemplos y contenidos que aprendamos en este taller. 

Sepan que vamos a utilizar el Scite como "IDE" para programar en Ruby, aunque no sea un IDE de ruby
en si, sino un editor de textos. 

Ahora si, una vez instalado todo, vallan a Inicio----> Todos los programas----> Ruby 186-26----->Scite. 
Se van a encontrar con algo como esto: 

Este es el famoso editor de texto del que les hablaba, con elque van a crear obras maestras-...... dentro
de unas cuantas clases xD. 

Les muestro una parte de codigo asi la analisamos y la ejecutamos asi ven como vamos a trabajar a lo
largo del taller =) 

Escriban en el editor: 

puts 'Hola'

Ahora, para poder ejecutar el programa primero deben guardarlo en su disco, con la extension *.rb, que
es la que tienen todos los scripts de Ruby. Asi que nos vamos a File--->Save As o
apretamos Control+S y guardamos el archivo donde queremos (yo les recomiendo que guarden este y
todos los archivos del taller en una misma carpeta, bien identificada, asi ganan orden y un acceso mas
facil para despues no tener que ir buscando los archibos por la PC --Bajon!--) pero con la extension *.rb. 

Por ejemplo puts.rb 

Una vez que lo guardaron con la extension *.rb el Scite habra reconocido este archivo como un script de
Ruby por eso ahora podemos ejecutarlo para ver como anda   Asi que presionen F8, y veran que a la
derecha aparecera otra ventana de fondo blanco, en la quen o van a poder escribir. Esta "nueva ventana
blanca" recibe el nombre de terminal y es donde se ejecutaran todos sus scripts. 

Ahora solo resta ejecutar el script, presionando F5 o llendo a Tools--->Go. Para limpiar esta terminal
apreta las teclasShift+F5 ya que cuando ejecutes varios scripts siempre quedan sus respectivas salidas
en esa terminal. 

Cuando ejecutes el script tendrias que obtener algo asi en tu terminal: 

>ruby puts.rb 
Hola 
>Exit code: 0

Buenisimo. 

La sentencia puts sirve para mostrar strings (string= cadena de texto) en pantalla, si lo pensas te das
cuenta puts = put string = poner cadena de texto. 

Espero que me vallan siguiendo, cualqueir cosa me preguntan   

Numeros y operaciones en Ruby  

En ruby, tenemos distintos tipos de datos que, a grandes rasgos, podemos identificar como Strings (o
cadenas de texto) y Numericos. 
Estos ultimos, los subclasificamos por tipo, y distinguimos a los Enteros y los Reales (tambien llamados
de Coma Flotante o Float) que serian los Reales Decimales. 

Para trabajar con numeros, hacemos uso de los Operadores Aritmeticos que nos permiten realizar las
operaciones mas comunes, como la suma( + ), la resta( - ), division( / ) y multiplicacion( * ). 

Ahora vamos a ver unos ejemplos para que entiendan mejor como trabajar los numeros con Ruby. 

#Sumar dos numeros y mostrarlos en pantalla: 


puts 4 + 4 

#Restar dos numeros y mostrarlos en pantalla: 


puts 6 - 3 

#Multiplicar dos numeros y mostrarlos en pantalla: 


puts 8 * 2 

#Dividir dos numeros y mostrarlos en pantalla: 


puts 3 / 2
Nota: las lineas antecedidas por el simbolo # son comentarios, es decir que esas lineas seran ignoradas
por el interprete. Esto es util, por ejemplo cuando queremos describir que hace un pedazo de codigo, o
comentar algunas lineas del mismo codigo, para que no sean interpretadas, etc,etc. 

Fijense que cuando ejecuten este codigo, les dara como resultado 

>ruby operadores.rb 


16 

>Exit code: 0

Si lo leen, se daran cuenta que la division de 3 con 2, dio como resultado 1 y no 1.5. Esto es porque los
numeros 3 y 2 son numeros Enteros. Para que el resultado sea 1.5 , tendriamos que haber
puesto 3.0 divido 2, ya que el 3.0 es un numero decimal o de coma flotante. Hagan la prueba y veran
que: 

puts 3.0 / 2

Nos devolvera 1.5 de resultado   

Operador Mod ( % ) 
El operador Mod, calcula el resto de una division entre dos numeros. Un ejemplo de su uso: 

puts (5 % 3) # muestra '2' en la salida

Ejecutenlo y veran que nos devolvera el valor 2   

Potencia de un numero ( ** ) 
Ruby, tambien nos facilita el operador ** que sirve para calcular la potencia de un numero. Por ejemplo,
si queremos calcular 3 al cuadrado y 2 al cubo: 

puts 3 ** 2 
puts 2 ** 3
Así de facil muchachos   

Variables en Ruby  

Bueno, como ya sabran algunos y otros no, basicamente las variables son dates que, como indica su
nombre, pueden variar durante la ejecucion de un programa, ya sea asignandoles un valor y luego otro,
o modificando con algun operador esos valores, etc,etc. 
Estas variables, si bien pueden cambiar el valor de sus datos, siempre mantienen el mismo tipo de
datos, es decir que una variable numerica, será siempre numerica a lo largo del programa. 

En Ruby, el valor a las variables se asigna así: 

# Defino una variable tipo string: 


miString = 'Viva Taringa y Caught In My Net' 

# Defino una variable tipo entera: 


miEntero = 1432 

# Defino una variable tipo Real o Decimal: 


miReal = 4,5 
miReal2 = 4.0 #si pusieramos miReal2 = 4 seria un Entero y no un Decimal o Real 

# Definicion de una Constante (El nombre de una constante debe ser escrito TOTALMENTE en
MAYUSCULAS): 
CONSTANTE = 5.3 

Nota: Sepan que Ruby es "case sensitive" osea que discrimina entre mayusculas y minusculas, por lo
cual no seria igual la variable miReal que miREAL. Así que tengan cuidado y acuerdense y fijense como
escriban las variables. 

Si prestaron atencion, acaban de ver ejemplos de como declarar variables y constantes, recuerden que
estas ultimas deben llevar el nombre escrito totalmente en mayusculas, sino Ruby las reconocera como
Variables. Tambien observen que a diferencia de otros lenguajes, en Ruby no es necesario declarar que
tipo de datos va a almacenar cada variable, ya que Ruby se da cuenta por la forma en la que van
declarando las mismas variables, así que resumiendo no se olviden de que: 

- Los valores asignados a un string van entre apostrofes ( ' ). 

- Las constantes se van a definir EN MAYUSCULAS, de lo contrario será una variable. 

- Los enteros no llevan punto decimal, sino serian definidos como Reales o Decimales 

Metodos To_i, To_f y To_s 


Estos metodos nos permiten convertir una variable a distintos tipo de datos: 

To_i : Convierten en un Entero (en ingles Integer) 

To_f : Convierten en un Decimal (en ingles Float) 

To_s : Convierten en un String. 

Por ejemplo, vamos a definir una variable como string y la convertiremos en Entera, y luego la vamos a
convertir a Decimal. 

#Defino el string y luego le asignaremos ese valor convertido en entero a una variable entera: 
miString = '1991' 

#Convierto miString en entero y se lo asigno a la variable miEntero: 


miEntero = miString.to_i 

#Convierto miEntero en Decimal / Real y lo asigno a la variable miReal: 


miReal = miEntero.to_f 

#Imprimo en pantalla los tres valores de las variables: 


puts miReal, miEntero, miString 

Lectura de Datos  

En las "capitulos" (?) anteriores, usamos el comando "puts", para mostrar los datos en pantalla. Estos
datos, etan definidos por nosotros, dentro del programa, es decir que no eran ingresados en el momento
de ejecucion del script. 
Ahora vamos a ver como tomar datos durante la ejecucion de un programa, es aquí donde gets (get=
obtener s=string   ) y el metodo chomp nos simplificaran la existencia xD. 

Por ejemplo, vamos a pedir que el usuario ingrese una edad por teclado, se la asignaremos a una
variable y luego mostraremos el valor de esa variable en pantalla: 

#ejemplo de Gets y Chomp 


puts "¿Que edad tenes?" 
STDOUT.flush 
edad = gets.chomp 
puts "Su edad es: " + edad +" años" 

Nota: Cuando ejecutes el codigo del ejemplo de Gets y Chomp tendras que hacer clic en la ventana de
output (la salida) del SciTE ya que el programa va a estar esperando que ingreses tu edad, si no lo
haces el programa no va a continuar hasta que ingreses una edad. 

Si vieron atentamente el codigo se daran cuenta que hay una CONSTANTE llamada "STDOUT" que yo
nunca inicializé (es decir, no le asigne ningun valor ni la definí). Esta constante es una constante interna
de Ruby, que almacena todas las salidas del programa. 

STDOUT.flush

El flush es un metodo que lo que hace es limpiar STDOUT para que no quede con basura de salidas
anteriores, es decir que siempre tenes que uzarlo antes de tomar un valor. 

edad = gets.chomp

Esta linea de codigo lo que hace es asignar a la variable "edad" el resultado del gets. Cuando vos tomas
un valor con gets, Ruby automaticamente le agrega al final el "\n" que es el salto de linea, lo que hace
el chomp es eliminar ese "\n" almacenado en el gets, asi que no te olvides de ponerlo!. 

Les pongo otro ejemplo así pueden entender mejor lo del STDOUT. 

Con este programa vamos a tomar 2 numeros por teclado, y vamos a sumarlos para luego calcular su
promedio. 

# Promedio de dos numeros 


puts "Ingrese el primer numero: " 
STDOUT.flush 
numeroA = gets.chomp 
puts "Ingrese el segundo numero: " 
STDOUT.flush 
numeroB = gets.chomp 
promedio = numeroA.to_i+numeroB.to_i 
puts "El promedio de los dos numeros es: ", promedio /2 

Si se fijan, aqui para poder operar con los numeros, tube que convertir los datos ingresados en Enteros
(Integers), ya que, como indica su nombre, gets, toma todos los valores como STRINGS. Es por eso que
tube que convertir con el metodo to_i numeroA y numeroB para que sean enteros. 

Bueno ahora que ya saben variables simples, operaciones con numeros y variables, saben leer datos
por teclado, saben constantes, saben los tipos de datos con los que nos podemos encontrar, etc. Les
voy a dejar algunos ejercicios para que practiquen, y retengan mejor la sintaxis y lógica. 

1) Hagan un programa que, ingresado un numero por teclado correspondiente a horas, calcule a
cuantos minutos equivale. 

2) Hagan un programa que pida ingresar 5 numeros, y luego calcule su promedio. 

Recuerden convertir todos los numeros con to_i o to_f para poder hacer operaciones. 

Métodos: Manipulación de objetos  

Para Ruby, todo es un objeto (más adelante voy a dedicar todo un capitulo a objetos y programacion
orientada a objetos, así que, no se preocupen si no entienden ahora) , desde las variables (un string,
etc) hasta los objetos definidos por el programador. 
Entonces, que es un metodo ? un metodo es lo que nos permite manipular un objeto. 

Por ejemplo, definimos la variable "a" como String (que en Ruby es tomada en cuenta como un objeto) y
luego usamos el metodo length para obtener su longitud: 

a = 'Esta cadena tiene 31 caracteres' 


puts a.length 

Esto nos va a dar por salida el numero "31", que es la longitud de carácteres (de la A a la Z + a ala z + 0
al 9+ el "_" -guion bajo- + el " " -espacio en blanco). 
El metodo length es un metodo predefinido por Ruby, es decir, que no lo definimos nosotros mismos.
Mas adelante vamos a ver como definir uno nosotros, manualmente. 

Metodos Bang (!) 

Y te estaras pregutnando que ***** es un metodo bang ? Un metodo Bang, es un metodo que no
devuelve o muestra el valor de un objeto, sino que lo modifican. Llevan ese nombre, ya que se los
considera peligrosos, por su capacidad de modificar directamente en el objeto. ¿Como distinguimos en
el codigo un metodo bang de uno que no lo es ? Un metodo bang, siempre lleva al final de su nombre un
"!" que hace que modifique al objeto. 

Veamos un ejemplo, para que quede mas claro: 

#Definimos la variable "a", como string, y la lleno con 


#una parte de una cancion de Megadeth xD (Trust) 

a = "We lie to each other so much" 

#Aclaro que el metodo "upcase" es para ver el valor de un string convertido en mayúsculas. 

#Usamos el metodo "comun" (no bang), por lo tanto el objeto no se modifica: 


b = a.upcase 
puts b 
puts a 
#Usamos un metodo bang (con "!" al final), en consecuencia la propiedad del objeto se modifica
y el string queda convertido TOTALMENTE en mayúsculas: 
c = a.upcase! 
puts c 
puts a 

Pensando en Objetos  

Bueno, tanto que prometi hablar de objetos, y acá estamos. Cuando entiendan lo expuesto en este
capitulo, van a entender mejor lo referente a Métodos, y cuales son las utilidades de los mismos.
Ademas, esto va a cambiar ampliamente la forma en que se planteen la programacion, ya que van a
poder hacer POO (Programacion Orientada a Objetos). 

Cuando hablamos de POO, hablamos entre otras cosas, de: 


- Abstraccion. 
- Encapsulamiento. 
- Herencia. 
- Polimorfismo. 
- Acoplamiento. 

La abstracción 
La abstracción, cuando nos referimos a POO, es la capacidad de poder abstraer las propiedades y
comportamientos comunes para poder representar un objeto. 
Por ejemplo, supongamos que vamos a representar un alumno como objeto, entonces si bien todos los
alumnos son diferentes, (algunos altos, otros enanos, rubios, morochos, etc) tenemos que abstraernos a
las propiedades y comportamientos que los hacen alumnos, y que tienen en comun entre ellos,
entonces podremos reconocer que todos los alumnos: 

- Van a una escuela determinada. 


- Tienen materias. 
- Tienen un numero determinado de las mismas. 
- Aprueban y Desaprueban sus materias. 
- Tienen una calificacion, etc. 

Encapsulamiento 
Esto significa, que las propiedades de cada objeto son privadas (propias del objeto) y ajenas a los
demas objetos. Ademas, solo se puede acceder a ellas por Métodos (como vimos en el capitulo
anterior), que pueden ser publicos o privados 

Al poner en practica estos conceptos desarrollando un objeto, no nos va a interesar su funcionamiento


interior, sino sus "productos" es decir, lo que hace, lo que nos regresa. 
Herencia 
Cuando se crean objetos nuevos a partir de otros existentes, estos van a heredar las propiedades y
comportamientos de sus "antecesores" por decir de algun modo. Hay solo dos tipos de herencia:
la Herencia Simple y la Herencia Múltiple. 

La herencia es muy usada cuando hacemos POO ya que se puede especificar el comportamiento de las
clases hijas, lo cual nos deja un mejor diseño en el sistema   

Polimorfismo 
El polimorfismo es la capacidad del objeto de tener métodos con el mismo nombre, pero con
comportamientos diferentes. Esto es conocido tambien como sobre escritura de métodos. 

Acoplamiento 
Es la medida en que un objeto depende de otro u otros, y mientras menor sea este acoplamiento,
mejor. 

Espero que les halla servido, y disculpenme, que les halla puesto esta parte tan "teorica y nada práctica"
pero va a ser necesario que lo entiendan, y sepan para poder entender bien la POO, ya que Ruby es un
lenguaje orientado a objetos.

Ahora si, podemos seguir. 

¿Que es una clase?  

Partamos de que un objeto es un contenedor de datos y que a la vez controla el acceso a los mismos.
Encadenados a los objetos, se encuentran los Atributos, que definen sus caracteristicas. Y luego estan
los Métodos, los cuales son como una "interfaz" para poder acceder o mejor dicho, interactuar con el
objeto. 

Las clases se utilizan para construir un objeto. Es decir, que vendrian a ser una especie de "molde" para
hacer objetos. Y cada objeto seria una instancia de la clase   es facil. 

Bueno... y resumiendo: ahora ya saben que es un método, que es un objeto, saben en que consiste la
POO y saben que es una clase. Así que no van a tener problemas para entender el siguiente ejemplo,
donde vamos a definir una clase, sus metodos, y objetos, para que puedan aplicar tooodo lo aplicado
=). 
#Definimos la clase Perro: 
class Perro 
#"Inicializamos" la clase con el metodo initialize: 
def initialize(raza, nombre, edad) 
#Aquí van los atributos de la clase 
@raza  = raza 
@nombre = nombre 
@edad = edad 
end #Fin del método initialize 

#Creamos el método ladrar 


def ladrar 
puts 'Guau Guau' 
end #Fin del método ladrar 

#Creamos el método saludar 


def saludar 
puts "Soy un perro de la raza #{@raza} y mi nombre es #{@nombre} y mi edad es #{@edad}" 
end #Fin del método saludar 
end #Final de la clase 

# Creo el objeto "a" de la clase "Perro" con el metodo new 


#y paso los valores como en el método "initialize(raza, nombre, edad)" 
#de cuando definimos la clase perro. 
a = Perro.new('siberiano','pancho','16') 

#Hacemos uso del método saludar, del nuevo objeto "a" 


a.saludar 
#Hacemos uso del método saludar, del nuevo objeto "a" 
a.ladrar 

Lean el codigo, que en el mismo, está todo explicado, ya que puse comentarios para que puedan
entenderlo bien  . 

Aclaraciones 

Cuando usamos #{@raza} por ejemplo en: 

puts "Soy un perro de la raza #{@raza} y mi nombre es #{@nombre} y mi edad es #{@edad}"

estamos haciendo referencia al atributo raza que definimos en initialize cuando incializamos la clase, el
cual recibe un valor cuando creamos el objeto: 

a = Perro.new('siberiano','pancho','16')

siberiano sera el valor del atributo raza 


pancho sera el valor del atributo nombre 
16 sera el valor del atributo edad 
Porque definimos que serian ingresados así, en ese orden, cuando hicimos 

initialize(raza, nombre, edad)

Y así fue que los recibieron cuando creamos el objeto: 

a = Perro.new('siberiano','pancho','16')

Cualquier duda que tengan, peguen un chifle, y yo se las respondo aca mismo en T!   

Espero que les halla gustado, porque me sacó mucho esfuerzo, ademas lo escribi toooodo yo   

Criticas, agradecimientos, etc son bienvenidos   

Saludos genteeeee!!! 

Cachilax