Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccin
Este es un pequeo tutorial de Ruby que no debera tomar ms de 20 minutos completarlo. Se asume que ya tienes instalado Ruby. Si no tienes Ruby funcionando en tu PC, descrgalo e instlalo antes de comenzar.
Ruby interactivo
Arranca el IRB. Si ests usando Mac OS X abre una Terminal y escribe irb, despus presiona enter. Si ests usando Linux, abre una Terminal y escribe irb, despus presiona enter. Si ests usando Windows, abre fxri desde la seccin Ruby de tu Men de Inicio.
irb(main):001:0>
Bien, ahora est abierto. Y ahora qu? Escribe esto: "Hola Mundo"
Ruby te obedeci!
Qu fue lo que pas? Acaso acabamos de escribir el programa Hola Mundo ms corto del mundo? No exactamente. La segunda linea slo es la forma que tiene IRB para decirnos el resultado de la ltima expresin evaluada. Si queremos que el programa escriba Hola Mundo necesitamos un poco ms:
puts es el comando bsico para escribir algo en Ruby. Pero entonces, qu es ese => nil? Ese es el resultado de la expresin. puts siempre retorna nil, que es el valor que significa absolutamente nada en Ruby.
El resultado de la llamada a este mtodo es el valor 3.0. Notars que no es simplemente 3. Eso es porque la mayora de las veces la raz cuadrada de un nmero no ser un nmero entero, as que el mtodo siempre retorna un nmero flotante. Y qu pasa si queremos recordar el resultado de algunas de estas operaciones? Asigna el resultado a una variable.
irb(main):010:0> def h irb(main):011:1> puts "Hola Mundo" irb(main):012:1> end => nil
La expresin def h inicia la definicin del mtodo. Le dice a Ruby que estamos definiendo un mtodo, cuyo nombre es h. La siguiente linea es el cuerpo del mtodo, la misma expresin que vimos anteriormente: puts "Hola Mundo". Finalmente, la ltima linea end la dice a Ruby que terminamos de definir el mtodo. La respuesta de Ruby => nil nos comunica que l sabe que terminamos de definir el mtodo.
irb(main):013:0> h Hola Mundo => nil irb(main):014:0> h() Hola Mundo => nil
Bien, eso fue fcil. Ejecutar un mtodo en Ruby es tan fcil como slo mencionar su nombre. Si el mtodo no requiere parmetros para ejecutarse, eso es todo lo que necesitas. Puedes agregar parntesis vacos, pero no son necesarios.
Y qu tal si queremos saludar slo a una persona y no a todo el mundo? Simplemente redefine h para que tome un nombre como parmetro.
irb(main):015:0> irb(main):016:1> irb(main):017:1> => nil irb(main):018:0> Hola Matz => nil
As que eso funciona pero tommonos un segundo para ver ms en detalle qu es lo que est sucediendo.
irb(main):019:0> irb(main):020:1> irb(main):021:1> => nil irb(main):022:0> Hola Pedro => nil irb(main):023:0> Hola Mundo => nil
Algunos otros trucos para destacar. Uno es que otra vez estamos llamando al mtodo sin utilizar los parntesis. Si lo que quieres hacer es obvio, los parntesis son opcionales. El otro truco es el parmetro por defecto Mundo. Esto significa si no se provee un nombre, utiliza el nombre por defecto "Mundo".
Convirtindolo en un Anfitrin
Qu hacemos si queremos tener un anfitrin ms en serio? Uno que recuerde tu nombre, te d la bienvenida y te trate con respeto. Puedes querer utilizar un objeto para eso. Vamos a crear la clase Anfitrion.
irb(main):024:0> class Anfitrion irb(main):025:1> def initialize(nombre = "Mundo") irb(main):026:2> @nombre = nombre irb(main):027:2> end irb(main):028:1> def decir_hola irb(main):029:2> puts "Hola #{@nombre}" irb(main):030:2> end irb(main):031:1> def decir_adios irb(main):032:2> puts "Adis #{@nombre}, vuelve pronto." irb(main):033:2> end irb(main):034:1> end => nil
La nueva palabra clave aqu es class. Esto define una nueva clase llamada Anfitrion y un par de mtodos para esa clase. Tambin toma nota de @nombre. Esta es una variable de instancia y est disponible para todos los mtodos de la clase. Como puedes ver es utilizada pordecir_hola y decir_adios. As que cmo hacemos para que esta clase Anfitrion nos sea de utilidad? Crea un objeto. Ahora vamos a crear y usar un objeto anfitrin:
irb(main):035:0> a = Anfitrion.new("Juan") => #<Anfitrion:0x16cac @nombre="Juan"> irb(main):036:0> a.decir_hola Hola Juan => nil irb(main):037:0> a.decir_adios Adis Juan, vuelve pronto. => nil
Una vez que el objeto a es creado, nos recuerda que el nombre es Juan. Mmm, y si queremos acceder al nombre directamente?
irb(main):038:0> a.@nombre SyntaxError: compile error (irb):52: syntax error from (irb):52
No, no podemos.
Ruby es fiel a las buenas costumbres de la programacin orientada a objetos manteniendo los datos lo ms privados posible. Entonces, qu mtodos estn disponibles para los objetos Anfitrion?
irb(main):039:0> Anfitrion.instance_methods => ["method", "send", "object_id", "singleton_methods", "__send__", "equal?", "taint", "frozen?", "instance_variable_get", "kind_of?", "to_a", "instance_eval", "type", "protected_methods", "extend", "eql?", "display", "instance_variable_set", "hash", "is_a?", "to_s", "class", "tainted?", "private_methods", "untaint", "decir_hola", "id", "inspect", "==", "===", "clone", "public_methods", "respond_to?", "freeze", "decir_adios", "__id__", "=~", "methods", "nil?", "dup", "instance_variables", "instance_of?"]
Bien. Eso es un montn de mtodos. Nosotros slo definimos dos mtodos. Qu es lo que est sucediendo? Bueno, estos son todoslos mtodos para los objetos Anfitrion, una lista completa, incluyendo los que estn definidos en las superclases de Anfitrion. Si queremos listar nicamente los mtodos definidos para la clase Anfitrion podemos pedirle que no incluya sus ancestros pasndole el parmetro false, que significa que no queremos los mtodos definidos por sus ancestros.
irb(main):041:0> a.respond_to?("nombre") => false irb(main):042:0> a.respond_to?("decir_hola") => true irb(main):043:0> a.respond_to?("to_s") => true
As que, sabe decir_hola, y to_s (que significa convertir algo en un string, un mtodo que est definido por defecto para todos los objetos), pero no reconoce nombre como un mtodo.
irb(main):044:0> class Anfitrion irb(main):045:1> attr_accessor :nombre irb(main):046:1> end => nil
En Ruby, puedes volver a abrir una clase y modificarla. Eso no cambia objetos que ya existan, pero afecta a los nuevos objetos que puedas crear. As que vamos a crear un nuevo objeto y juguemos con su propiedad @nombre.
irb(main):047:0> a = Anfitrion.new("Pedro") => #<Anfitrion:0x3c9b0 @nombre="Pedro"> irb(main):048:0> a.respond_to?("nombre") => true irb(main):049:0> a.respond_to?("nombre=") => true irb(main):050:0> a.decir_hola Hola Pedro => nil irb(main):051:0> a.nombre="Matilde" => "Matilde" irb(main):052:0> a => #<Anfitrion:0x3c9b0 @nombre="Matilde"> irb(main):053:0> a.nombre => "Matilde" irb(main):054:0> a.decir_hola Hola Matilde => nil
El uso de attr_accessor determin que se definan dos nuevos mtodos por nosotros, nombre para obtener el valor, y nombre= para modificarlo.
#!/usr/bin/env ruby class MegaAnfitrion attr_accessor :nombres # Crear el objeto def initialize(nombres = "Mundo") @nombres = nombres end # Decirle hola a todos def decir_hola if @nombres.nil? puts "..." elsif @nombres.respond_to?("each") # @nombres es una lista de algn tipo, # as que podemos iterar! @nombres.each do |nombre| puts "Hola #{nombre}" end else puts "Hola #{@nombres}" end end # Decirle adis a todos def decir_adios if @nombres.nil? puts "..." elsif @nombres.respond_to?("join") # Juntar los elementos de la lista # usando la coma como separador puts "Adis #{@nombres.join(", ")}. Vuelvan pronto." else puts "Adis #{@nombres}. Vuelve pronto." end end end
if __FILE__ == $0
ma = MegaAnfitrion.new ma.decir_hola ma.decir_adios # Cambiar el nombre a "Diego" ma.nombres = "Diego" ma.decir_hola ma.decir_adios # Cambiar el nombre a un vector de nombres ma.nombres = ["Alberto", "Beatriz", "Carlos", "David", "Ernesto"] ma.decir_hola ma.decir_adios # Cambiarlo a nil ma.nombres = nil ma.decir_hola ma.decir_adios end
Guarda este archivo como ri20min.rb, y ejectalo con ruby ri20min.rb. El resultado debera ser:
Hola Mundo Adis Mundo. Vuelve pronto. Hola Diego Adis Diego. Vuelve pronto. Hola Alberto Hola Beatriz Hola Carlos Hola David Hola Ernesto Adis Alberto, Beatriz, Carlos, David, Ernesto. Vuelvan pronto. ... ...
Hay un montn de cosas nuevas en este nuevo ejemplo en las que podemos echar una mirada ms profunda. As que, investigando nuestro programa, notars que las primeras lineas comienzan con un numeral (#). En Ruby, todo lo que est detrs de un numeral es un comentario y es ignorado por el intrprete. La primer linea del archivo es un caso especial y en los sistemas operativos del estilo Unix determina cmo ejecutar el archivo. El resto de los comentarios estn nicamente para aportar claridad al significado del cdigo.
# Decirle hola a todos def decir_hola if @nombres.nil? puts "..." elsif @nombres.respond_to?("each") # @nombres es una lista de algn tipo, # as que podemos iterar! @nombres.each do |nombre| puts "Hola #{nombre}" end else puts "Hola #{@nombres}" end end
Ahora usa el atributo @nombres para tomar decisiones. Si es nil, slo imprime tres puntos. No hay razn para saludar a nadie, cierto?
Iterando
Si el objeto @nombres responde al mtodo each, es algo sobre lo que se puede iterar, as que iteramos entre sus elementos y saludamos a cada uno de sus integrantes. Finalmente, si @nombres es otra cosa, dejamos que automticamente se convierta en un string y usamos el saludo por defecto. Veamos ese iterador en ms detalle:
hacer_algo_con(elementos[i]); }
Esto funciona, pero no es muy elegante. Necesitas una variable descartable como i, averiguar la cantidad de elementos de la lista, y explicar cmo recorrerla. La costumbre Ruby (The Ruby Way) es mucho ms elegante, todos los detalles de infraestructura se ocultan en el mtodo each, todo lo que necesitas hacer es decirle qu hacer con cada elemento. Internamente, el mtodo each llamar yield "Alberto", despus yield "Beatriz", despus yield "Carlos", y as sucesivamente.
# Decirle adis a todos def decir_adios if @nombres.nil? puts "..." elsif @nombres.respond_to?("join") # Juntar los elementos de la lista # usando la coma como separador puts "Adis #{@nombres.join(", ")}. Vuelvan pronto." else puts "Adis #{@nombres}. Vuelve pronto." end end
El mtodo decir_adios no usa each, en vez de eso se fija si @nombresresponde al mtodo join, y si es as, lo usa. Si no es as, simplemente imprime la variable como un string. Esta prctica de no preocuparse sobre el tipo de objeto de una variable, y simplemente depender de los mtodos que esta soporta, es conocida como Duck Typing. El beneficio es que no limita innecesariamente los tipos de variables que son soportados. Si alguien inventa un nuevo tipo de lista, siempre y cuando implemente el mtodo join con la misma semntica que otras listas, todo funcionar como fue planeado.
Arrancando el Script
As que eso es la clase MegaAnfitrion, el resto del archivo slo llama a los mtodos de la clase. Hy un ltimo truco para tener en cuenta, y es la linea:
if __FILE__ == $0
__FILE__ es la variable mgica que contiene el nombre del archivo que se est ejecutando en ese momento. $0 es el nombre del archivo usado para iniciar el programa. Esta verificacin dice si este es el archivo principal. Esto permite que un archivo sea utilizado como una biblioteca, y no ejecutar cdigo en ese contexto. Pero si el archivo est siendo usado como un ejecutable, entonces ejecuta ese cdigo.
Considrate iniciado
Eso es todo en este rpido paseo por Ruby. Hay mucho ms por explorar, las estructuras de control diferentes que ofrece Ruby; el uso e los bloques y yield; mdulos como mixins; y ms. Espero que esta pequea muestra de Ruby te despierte el inters por saber ms. Si es as, por favor dirgete a nuestra area de Documentacin, donde encontrars vnculos a cursos y manuales, todos disponibles gratuitamente en internet. O si realmente te gustara sumergirte en un libro, busca en el listado de libros los ttulos disponibles para venta en linea o en tu tienda favorita. Visita el sitio oficial de Ruby para Descargas y ms documentacin |
moften ..