programación en ruby

11
Programación en Ruby Programación en Ruby 1 Introducción Ruby es un lenguaje de programación interpretado, re- flexivo y orientado a objetos, creado por el programador japonés Yukihiro “Matz” Matsumoto, quien comenzó a trabajar en Ruby en 1993, y lo presentó públicamente en 1995. Combina una sintaxis inspirada en Python, Perl con características de programación orientada a objetos simi- lares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. Ruby es un lenguaje de programación interpre- tado en una sola pasada y su implementación oficial es distribuida bajo una licencia de software libre. 2 Índice 1. Capítulo 1: Introducción 2. Capítulo 2: Historia 3. Capítulo 3: Instalación (a) Instalando Ruby en un ordenador Windows (b) Instalando Ruby en un ordenador Linux (c) Primer programa 4. Capítulo 4: Palabras reservadas 5. Capítulo 5: Tipos de datos (a) Números (b) Strings (c) Date/Time 6. Capítulo 6: Operaciones de entrada y salida (a) Operaciones básicas de I/O 7. Capítulo 7: Tipos de datos complejos 8. Capítulo 8: Declaración e inicialización de variables 9. Capítulo 9: Operadores con asociatividad y prece- dencia 10. Capítulo 10: Estructuras de decisión e iteración 11. Capítulo 11: Declaración, definición y uso de méto- dos y funciones 12. Capítulo 12: Programación orientada a objetos 13. Capítulo 13: Constructores literales 14. Capítulo 14:Recolección de basura 15. Capítulo 15: Herencia 16. Capítulo 16: Administración y separación de la me- moria 17. Capítulo 17: Implementación de co-rutinas 18. Capítulo 18: Manejo de excepciones 19. Capútlo 19: Gramática en EBNF del lenguaje 20. Capítulo 20: Características especiales del lenguaje 21. Capítulo 21: Ejemplos del lenguaje 22. Capítulo 22: Enlaces externos 3 Historia [[Archivo: El lenguaje fue creado por Yukihiro “Matz” Matsumoto, quien empezó a trabajar en Ruby el 24 de febrero de 1993, y lo presentó al público en el año 1995. En el círculo de amigos de Matsumoto se le puso el nom- bre de “Ruby” (en español rubí) como broma aludiendo al lenguaje de programación “Perl” (perla). La última ver- sión estable es la 1.8.6, publicada en diciembre de 2007. El 26 de ese mismo mes salió Ruby 1.9.0, una versión en desarrollo que incorpora mejoras sustanciales en el ren- dimiento del lenguaje, que se espera queden reflejadas en la próxima versión estable de producción del lengua- je, Ruby 1.9.0.1 Diferencias en rendimiento entre la ac- tual implementación de Ruby (1.8.6) y otros lenguajes de programación más arraigados han llevado al desarro- llo de varias máquinas virtuales para Ruby. Entre ésas se encuentra JRuby, un intento de llevar Ruby a la platafor- ma Java, y Rubinius, un intérprete modelado basado en las máquinas virtuales de Smalltalk. Los principales desa- rrolladores han apoyado la máquina virtual proporciona- da por el proyecto YARV, que se fusionó en el árbol de código fuente de Ruby el 31 de diciembre de 2006, y se dará a conocer como Ruby 1.9.0.1. [1] 1

Upload: omar-castillo

Post on 17-Dec-2015

6 views

Category:

Documents


0 download

DESCRIPTION

Programación en Ruby

TRANSCRIPT

  • Programacin en Ruby

    Programacin en Ruby

    1 IntroduccinRuby es un lenguaje de programacin interpretado, re-exivo y orientado a objetos, creado por el programadorjapons Yukihiro Matz Matsumoto, quien comenz atrabajar en Ruby en 1993, y lo present pblicamente en1995. Combina una sintaxis inspirada en Python, Perl concaractersticas de programacin orientada a objetos simi-lares a Smalltalk. Comparte tambin funcionalidad conotros lenguajes de programacin como Lisp, Lua, Dylany CLU. Ruby es un lenguaje de programacin interpre-tado en una sola pasada y su implementacin ocial esdistribuida bajo una licencia de software libre.

    2 ndice1. Captulo 1: Introduccin

    2. Captulo 2: Historia

    3. Captulo 3: Instalacin

    (a) Instalando Ruby en un ordenador Windows(b) Instalando Ruby en un ordenador Linux(c) Primer programa

    4. Captulo 4: Palabras reservadas

    5. Captulo 5: Tipos de datos

    (a) Nmeros(b) Strings(c) Date/Time

    6. Captulo 6: Operaciones de entrada y salida

    (a) Operaciones bsicas de I/O

    7. Captulo 7: Tipos de datos complejos

    8. Captulo 8: Declaracin e inicializacin de variables

    9. Captulo 9: Operadores con asociatividad y prece-dencia

    10. Captulo 10: Estructuras de decisin e iteracin

    11. Captulo 11: Declaracin, denicin y uso de mto-dos y funciones

    12. Captulo 12: Programacin orientada a objetos

    13. Captulo 13: Constructores literales

    14. Captulo 14:Recoleccin de basura

    15. Captulo 15: Herencia

    16. Captulo 16: Administracin y separacin de la me-moria

    17. Captulo 17: Implementacin de co-rutinas

    18. Captulo 18: Manejo de excepciones

    19. Captlo 19: Gramtica en EBNF del lenguaje

    20. Captulo 20: Caractersticas especiales del lenguaje

    21. Captulo 21: Ejemplos del lenguaje

    22. Captulo 22: Enlaces externos

    3 Historia[[Archivo: El lenguaje fue creado por Yukihiro MatzMatsumoto, quien empez a trabajar en Ruby el 24 defebrero de 1993, y lo present al pblico en el ao 1995.En el crculo de amigos de Matsumoto se le puso el nom-bre de Ruby (en espaol rub) como broma aludiendo allenguaje de programacin Perl (perla). La ltima ver-sin estable es la 1.8.6, publicada en diciembre de 2007.El 26 de ese mismo mes sali Ruby 1.9.0, una versin endesarrollo que incorpora mejoras sustanciales en el ren-dimiento del lenguaje, que se espera queden reejadasen la prxima versin estable de produccin del lengua-je, Ruby 1.9.0.1 Diferencias en rendimiento entre la ac-tual implementacin de Ruby (1.8.6) y otros lenguajesde programacin ms arraigados han llevado al desarro-llo de varias mquinas virtuales para Ruby. Entre sas seencuentra JRuby, un intento de llevar Ruby a la platafor-ma Java, y Rubinius, un intrprete modelado basado enlas mquinas virtuales de Smalltalk. Los principales desa-rrolladores han apoyado la mquina virtual proporciona-da por el proyecto YARV, que se fusion en el rbol decdigo fuente de Ruby el 31 de diciembre de 2006, y sedar a conocer como Ruby 1.9.0.1. [1]

    1

  • 2 6 NMEROS

    4 Tutorial de InstalacinDescargando RubyComo lenguaje multiplataforma, Ruby ha sido portadoa distintos sistemas operativos y arquitecturas. Esto sig-nica que si tu desarrollas un programa en un PC (porejemplo), ser posible ejecutarlo en otra mquina distin-ta como es un MAC (por poner otro ejemplo).Las siguientes instrucciones son para instalar Ruby en unaPC. Para otras plataformas, ver este captulo de la Whys(poignante) guide to Ruby.La forma ms sencilla de instalar Ruby en un PC es me-diante el Ruby One-Click Installer. Despus de descar-garlo instlalo aceptando todo por defecto. Al instalarse,las Variables de Entorno del Sistema son actualizadas, detal forma que se incluya el directorio del ejecutable deRuby: gracias a esto, podrs ejecutarle desde cualquierdrectorio en tu PC.La instalacin de Ruby incluye la primera edicin del li-bro Programming Ruby y el editor SciTe.Los directorios de la instalacinSupongamos que la instalacin de Ruby fue en c:/ruby.Esta instalacin cre una serie de directorios:c:/ruby/bin es donde los ejecutables son instalados (in-cluyendo ruby e irb).c:/ruby/lib/ruby/1.8 aqu estn programas escritos enruby. Estos cheros son libreras de Ruby: proveen fun-cionalidades que puedes incorporar en tus programas.c:/ruby/lib/ruby/1.8/i386-mswin32 contiene una seriede extensiones especcas del PC. Los cheros en estaterminacin acaban en .so o .dll (dependiendo de la pla-taforma). Estos cheros con extensiones programadas enlenguaje C; dicho de otra forma: son hceros binarios,compilados durante el proceso de instalacin, que se pue-den ejecutar desde Ruby.c:/ruby/lib/ruby/site_ruby aqu es donde el administra-dor de tu sistema y/o t podis almacenar las extensionesy libreras de terceras partes: cdigo escrito por ti mismo,o por otros.c:/ruby/lib/ruby/gems es el sistema Ruby-Gemes, en-cargado de la instalacin de nuevas herramientas.c:/ruby/src es donde se halla el cdigo fuente de Ruby.c:/ruby/samples/RubySrc-1.8.6/sample aqu podrsencontrar algunos programas ejemplo escritos en Ruby.

    4.1 Programa Hola Mundo!"

    Arranca el IRB (Interactive Ruby).La pantalla nos muestra:irb(main):001:0>

    Escribe esto: Hola Mundo y luego ENTERLa pantalla muestra:irb(main):001:0> Hola Mundo => Hola MundoRuby te obedeci!Qu fue lo que pas? Acaso acabamos de escribir elprograma Hola Mundo ms corto del mundo? No exac-tamente. La segunda linea slo es la forma que tiene IRBpara decirnos el resultado de la ltima expresin evalua-da. Si queremos que el programa escriba Hola Mundonecesitamos un poco ms:irb(main):002:0> puts HolaMundo HolaMundo => nilputs es el comando bsico para escribir algo en Ruby. Pe-ro entonces, qu es ese => nil? Ese es el resultado dela expresin puts siempre retorna nil, que es el valor quesignica absolutamente nada en Ruby.

    5 Diccionario de Palabras Reserva-das, Operadores y Smbolos delLenguaje

    Los tipos de datos son, como su nombre lo indica, losdiversos datos que se pueden almacenar en la memoriausando el lenguaje de programacin Ruby. Como en to-do lenguaje de programacin, se tiene una diferencia encuanto a estos datos, pues la cantidad de memoria queusan no es similar, y esta diferencia hace que la distin-cin entre unos y otros sea importante.

    6 NmerosEn ruby, todo es tratado como un objeto, eso no excluye alos nmeros, en forma general, ruby cuenta con diferentesclases para manejar cada tipo de nmeros, por ejemplo:

    Integer -> la clase base de donde derivan todos losenteros.

    Fixnum -> clase para nmeros enteros, su tamaodepende de la arquitectura de donde se interprete elcdigo, sin embargo, su tamao es eso 1 bit y usacomplemento 2 para su representacin en memoria,si un nmero excede el tamao asignado, automati-camente se convierte en bignum.

    Bignum -> Contiene valores mayores a xnum, larestriccin depende de la arquitectura pero pue-den guardarse nmeros muy grandes, tanto como denuestra memoria, si el nmero ingresado cabe en unxnum, automticamente se convierte a esta clase.

    Float -> Almacena nmeros con punto otante conla arquitectura de doble precisin nativa.

  • 3 Rational -> Almacena nmeros racionales, es decir,nmeros con un valor de numerador y un denomi-nador.

    7 StringsPara las cadenas de caracteres, su uso es bastante simi-lar al de cualquier lenguaje orientado a objetos, con laclase String, sin embargo cabe mencionar algunas carac-teristicas mas emocionantes de ruby, por ejemplo, puedesmultiplicar cadenas!Hola * 5 => Hola Hola Hola Hola HolaPara una vista mas completa referirse al capitulo deStrings

    8 Date/TimeRuby ya trae librerias para manejar los tipos date y time,sin embargo para usarlos, debemos llamar a la libreracorrespondiente, esto con la palabra reservada require.require date

    Con esto ya podemos usar el tipo Date, este contiene unfecha(dia, mes, ao), sin embargo, si deseas agregar la ho-ra debemos hacer uso de otra clase: DateTime, que con-tiene, adems de la fecha, la hora, minutos y segundos dela instancia que creemos.

    9 Operaciones de Entrada y SalidaOperaciones Bsicas de I/O El mtodo bsico paraimprimir algo en Ruby es usando print(), o, si queremosespaciado println(), como en c++print(Hola mundo)=> Hola MundoRecordemos que ruby es un lenguaje interpretado, por loque no es necesario todo un gran protocolo para imprimiralgn valor, genial no?Ademas, hay otra forma de mandar una salida, mirenputs Hola mundo, de nuevo => Hola mundo, de nuevoTodo esta bien hasta ac, pero Y si queremos reci-bir alguna entrada?, eso tambien es simple, usamos el co-mando gets, veamosputs "Como te llamas?" name = gets.chompputs Hola " + name + "!"eso te pide te nombre, lo guarda en la variable name ylo utiliza para imprimir un saludo.

    10 Tipos de datos Complejos

    Representacin de una claseUna clase en Ruby se representa por la palabra reserva-da class seguida del nombre de la clase. El nombre de lamisma se comienza normalmente con una letra mays-cula. La declaracin de la clase se cierra con la palabrareservada end.Ejemplo:class Lenguaje # esta clase cuenta con un constructor sinparmetros def initialize # # end end

    Para utilizar esta clase se declara una variable y se inicia-liza de la siguiente manera:miLenguaje = Lenguaje.new

    Declaracin de un arregloUn arreglo es una coleccin de elementos que pueden seraccesados por un ndice. En este caso el ndice es un valorentero y los mismos comienzan desde cero. Se utiliza elnombre de la variable junto con brackets para referirse aun valor especco.Ejemplo:numeros = [ 3, 4, 12, 22.5 ] colores = [ rojo, azul,verde ] # sacando el primer elemento de numeros y elsegundo de colores puts(numeros[0]) puts(colores[1])

    11 Declaracin e inicializacin deVariables

    Declaracin e inicializacin de variablesEn Ruby no hay una declaracin explcita del tipo de da-to de una variable. El mismo se determina en tiempo deejecucin a partir del valor que se le ha asignado. Esto sig-nica que las variables pueden tomar diferentes tipos dedatos en diferentes partes del programa. Para determinarsi un nombre hace referencia a una variable o a un m-todo, Ruby utiliza heurstica, en la cual a medida que valeyendo el cdigo fuente va llevando control de los smbo-los que ha ledo, asumiendo que los mismos son variables.Cuando se encuentra con un smbolo que puede ser unavariable o un mtodo, revisa si ya se le ha asignado algoanteriormente. Si es as, entonces lo trata como variable;si no, lo trata como un mtodo.Ejemplo:#declaracin de una variable de tipo String Nombreclase= Lenguajes de Programacin #declaracin de una va-riable de tipo entero Numeroalumnos = 30 #declaracinde un arreglo numeros = [ 3, 4, 12, 22.5 ]

  • 4 14 DECLARACIN, DEFINICIN Y USO DE MTODOS Y FUNCIONES

    12 Tabla de Operadores con Aso-ciatividad y Precedencia

    Tabla de operadores con precedencia de ms alta ams baja*Operadores marcados con SI pueden tratarse comomtodos, y por lo tanto se pueden sobreescribir.Ruby soporta hacer corto circuito en los operadoresde comparacin.

    13 Estructuras de Decisin e Itera-cin

    Estructuras SimplesEn Ruby, slo nil y false son evaluados como falso, todolo dems (incluyendo 0), es verdadero. En Ruby nil es unobjeto. Puedes agregar mtodos a nil como a cualquierotro objeto y puedes llamar los mtodos de nil como losde cualquier otro objeto. Vamos a explorar algunas es-tructuras muy simples disponibles en Ruby. El ejemploque sigue (p014estructuras.rb) muestra la estructura if el-se end. Es costumbre en ruby no poner parntesis con ify while.1 #En Ruby, nil y false son evaluados como falso 2 #todolo demas (incluyendo 0) es verdadero. 3 # nil es un objeto4 # if else end 5 var = 5 6 if var > 4 7 puts La variable esmayor que 4 8 puts Puedo tener muchas declaracionesaqui 9 if var == 5 10 puts Es posible tener if y elseanidados 11 else 12 puts Too cool 13 end 14 else 15puts La variable no esmayor que 4 16 puts Puedo tenermuchas declaraciones aqui 17 end 18 19 # Loops 20 var= 0 21 while var < 10 22 puts var.to_s 23 var += 1 24 endUn ejemplo del uso de elsif est en el programap015elsif.rb :1 # ejemplo del uso de elsif 2 3 # Ejemplo original 4 putsHola, cual es tu nombre?" 5 STDOUT.ush 6 nombre =gets.chomp 7 puts 'Hola, ' + nombre + '.' 8 9 if nombre =='Juan' 10 puts 'Que bonito nombre!!' 11 else 12 if nombre== 'Ivan' 13 puts 'Ivan es Juan en ruso!!' 14 end 15 end16 17 # Ejemplo modicado usando elsif 18 puts Ho-la, cual es tu nombre?" 19 STDOUT.ush 20 nombre =gets.chomp 21 puts 'Hola, ' + nombre + '.' 22 23 if nombre== 'Juan' 24 puts 'Que bonito nombre!!' 25 elsif nombre== 'Ivan' 26 puts 'Ivan es Juan en ruso!!' 27 end 28 29 #Otra modicacion 30 puts Hola, cual es tu nombre?" 31STDOUT.ush 32 nombre = gets.chomp 33 puts 'Hola,' + nombre + '.' 34 35 # || es el operador logico 'o' 36 ifnombre == 'Juan' || nombre == 'Ivan' 37 puts 'Que bonitonombre!!' 38 endAlgunos operadores condicionales comunes son: ==, !==, Ruby tiene tambin una forma negativa deif. La estructura unless comienza con la palabra unless

    y termina con end. El cuerpo es el texto que aparece enmedio de las dos. A menos que la expresin que continea la palabra unless sea verdadera, el cuerpo es ejecutado,de lo contrario el intrprete lo ignora.1 unless ARGV.length == 2 2 puts Usage: program.rb23 45 3 exit 4 endEn el programa anterior, el cuerpo es ejecutado a menosque el nmero de elementos en el array sea igual a 2. Elmtodo Kernel.exit termina el programa, regresando unvalor de status al sistema operativo. Loops como whileestn disponibles. Observa el siguiente ejemplo:1 #Loops 2 3 var = 0 4 while var < 10 5 puts var.to_s 6var += 1 7 end1.Escribe un programa (p016bisiesto.rb) que pregunte alusuario un ao cualquiera y determine si es bisiesto o no.2.Escribe un mtodo llamado bisiesto que acepte un ao,determine si es bisiesto y calcule el nmero total de mi-nutos para ese ao. (p017metodobisiesto)Para determinar si un ao es bisiesto: 1.Si el ao es divi-sible ente 4, ve al paso 2. Si no, ve al paso 5. 2.Si el ao esdivisible ente 100, ve al paso 4. Si no, ve al paso 5. 3.Siel ao es divisible ente 400, ve al paso 4. Si no, ve al paso5. 4.El ao es bisiesto. (Tiene 365 das). 5.El ao no esbisiesto. (Tiene 365 das).Expresiones case Esta estructura funciona de maneramuy similar a una serie de expresiones if: te permite enu-merar una serie de condiciones y ejecutar una expresinque corresponda al primer valor que sea verdadero. Porejemplo, los aos bisiestos deben ser divisibles entre 400o entre 4 y no entre 100. Ten presente que case regresa elvalor de la ltima expresin ejecutada.1 year = 2000 2 3 leap = case 4 when year % 400 == 0:true 5 when year % 100 == 0: false 6 else year % 4 == 07 end 8 9 puts leap 10 11 #el resultado es: true

    14 Declaracin, denicin y uso deMtodos y Funciones

    Mtodoslos mtodos en ruby se denen utilizando la palabra re-servada def al iniciar la rutina y end al nalizarladef Metodo endpara mandarle parametros, solo debemos escribir entreparentesis estos, separados por comasdef Suma(Operando1, OPerando2) puts Operando1 +Operando2 endpara especicar que el mtodo retornar algun valor, solodebemos usar la palabra reservada returndef Suma(Operando1, OPerando2) sum = Operando1 +Operando2 return sum end

  • 5sin embargo, es importante hacer notar que de todas ma-neras ruby retorna la ultima expresin evaluada en el m-todo, por lo tanto escribirdef met return Hola endes igual adef met Hola end

    15 Implementacin y uso de la Pro-gramacin Orientada a Obje-tos

    Escribiendo nuestras propias clasesHasta ahora hemos usado el estilo de programacin pro-cedural (que todava se utiliza en lenguajes como C) paraescribir nuestros programas. Programar de manera pro-cedural signica que nos enfocamos en los pasos necesa-rios para completar la tarea sin prestar atencin a cmoson manipulados los datos.En el estilo de programacin Orientado a objetos, los ob-jetos son tus agentes, tus proxies, en el universo de tuprograma. Tu les pides informacin, les asignas tareas, lespides que realicen clculos y te los reporten y los comuni-cas entre si para que trabajen juntos. Cuando disees unaclase, piensa en los objetos que van a ser creados de ella.Piensa acerca de lo que los objetos conocen y las cosasque hacen.Las cosas que un objeto sabe de si mismo se llaman va-riables de instancia (instance variables). Representan elestado de un objeto (los datos, por ejemplo, la cantidad yel id de un producto) y pueden existir valores nicos paracada instancia de la clase. Las cosas que un objeto puedehacer se llaman mtodos. Un objeto es una entidad quesirve como contenedor de datos y tambin controla el ac-ceso a los mismos. Asociados con el objeto, hay una seriede atributos que esencialmente no son ms que variablesque le pertenecen al objeto. Tambin asociadas con el ob-jeto, hay una serie de funciones que proveen una interfacepara la funcionalidad del objeto, llamadas mtodos. HalFulton Una clase es una combinacin de estado y mto-dos y es utilizada para construir objetos. Es una especiede plano para un objeto. Por ejemplo, es posible que uti-lices una clase llamada Boton para hacer decenas de bo-tones diferentes y cada uno puede tener su propio color,tamao, forma, etiqueta, etc. Un objeto es una instanciade una clase.Lee esto con atencin!Las clases en ruby son objetos de primera clase, cadauna es una instancia de la clase Class. Cuando una nuevaclase es denida (de manera tpica usando class Nom-bre end), un objeto de clase Class es creado y asignado auna constante (Nombre en este caso). Cuando llamamosNombre.new para crear un objeto, el mtodo de instancia

    en la clase Class es llamado, que a su vez llama al mto-do allocate que asigna memoria para el objeto antes denalmente llamar el mtodo initialize. Las fases de cons-truccin e inicializacin de un objeto son independien-tes y ambas pueden ser sobreescritas. La inicializacn sehace mediante el mtodo de instancia initialize mientrasque la construccin se hace va el mtodo de clase new.initialize no es un constructor!. La siguiente Jerarqua declases es informativa. Vamos a escribir nuestra primeraclase simple. p029perro.rb1 # denicion de la clase Perro 2 class Perro 3 def initiali-ze(raza, nombre) 4 # Variables de instancia 5 @raza = ra-za 6@nombre = nombre 7 end 8 9 def ladra 10 puts 'Ru!Ru!' 11 end 12 13 def muestra 14 puts Soy de raza#{@raza} y mi nombre es #{@nombre}" 15 end 16 end17 18 # Crear un objeto 19 # Los objetos son creados enel 'heap' 20 p = Perro.new('Labrador', 'Benzy') 21 22 =be-gin 23 Cada objeto 'nace' con ciertas abilidades innatas.24 Para ver una lista de los mtodos con los que nace unobjeto 25 puedes llamar el metodo methods 26 =end 27puts p.methods.sort 28 29 # Entre todos estos metodos,oject_id y respond_to? son 30 # importantes. Cada obje-to en ruby tiene asociado un numero 31 # unico. 32 putsEl id del objeto es #{p.object_id}. 33 34 # Para saber siun objeto sabe como responder a un mensaje 35 # puedesusar el metodo respond_to? 36 if p.respond_to?('habla')37 p.habla 38 else 39 puts 'Lo siento, el objeto no entien-de el mensaje habla.' 40 end 41 42 p.ladra 43 p.muestra44 45 # hacer que p y p1 hagan referencia al mismo ob-jeto 46 p1 = p 47 p1.muestra 48 49 # hacer que p hagareferencia a nil 50 p = nil 51 52 53 # Si ahora declara-mos: 54 p1 = nil 55 # entonces el Objeto de clase perroes abandonado y es 56 # elegible para la recoleccion debasura (GC)Si ejecutamos el programa, adems de la lista de mtodoscon los que nace el objeto 1, obtenemos como resultado:El id del objeto es 281140. Lo siento el objeto no entien-de el mensaje habla. Ru! Ru! Soy de la Raza Labra-dor y mi nombre es Benzy Soy de la Raza Labrador y minombre es BenzyEl mtodo new es usado para crear un objeto de clasePerro. Los objetos son creados en el heap. La variable pes conocida como una variable de referencia. No guardael objeto en si, sino algo parecido a un apuntador o unadireccin del objeto. Utilizamos el operador punto (.) enuna variable de referencia para decir, utiliza lo que es-t antes del punto para traerme lo que est despus delpunto. Por ejemplo: p.ladra.Si ests escribiendo una aplicacin Rails en la que unode tus modelos es, digamos, Cliente, entonces cuando es-cribes el cdigo que hace que las cosas pasen (un clienteaccesando un sitio, actualizando un nmero de telfonode un cliente, agregando un artculo a un carrito de com-pras), con toda seguridad estars enviando mensajes a ob-jetos de la clase Cliente. An recin creado, un objeto noest completamente en blanco. Tan pronto como un obje-

  • 6 15 IMPLEMENTACIN Y USO DE LA PROGRAMACIN ORIENTADA A OBJETOS

    to comienza a existir, responde a algunos mensajes. Cadaobjeto 'nace' con ciertas habilidades innatas. Para ver unalista de los mtodos con los que nace un objeto, puedesusar el mtodo methods.Es posible determinar de antemano (antes de pedirle a unobjeto que haga algo) si un objeto es capaz de manejardeterminado mensaje usando el mtodo respond_to?. Es-te mtodo existe para todos los objetos; puedes pregun-tarle a cualquier objeto si responde a cualquier mensaje.respond_to? aparece usualmente en conexin con la con-dicion lgica if.1 class Perro 2 def initialize(raza, nombre) 3 @raza =raza 4 @nombre = nombre 5 end 6 end 7 8 p = Pe-rro.new('Alsacian', 'Lassie') 9 puts p.class.to_sEl resultado es:RubyMate r8136 runnin Ruby r1.8.6(/usr/local/bin/ruby) >>> perro2.rb perroinstance_of? regresa true si el objeto es instancia de laclase especicada.1 num = 10 2 puts (num.instance_of? Fixnum) # trueLas clases abiertas de RubyEn Ruby, las clases nunca son cerradas: siempre puedesagregar mtodos a una clase que ya existe. Lo anterioraplica tanto para las clases que tu escribes como para lasclases estndar includas en Ruby. Todo lo que tienes quehacer es abrir la denicin de una clase existente y el nue-vo contenido que especiques va a ser agregado. En elejemplo pasado, denimos la clase Motocicleta en el ar-chivo p030motocicleta.rb.1 class Motocicleta 2 def initialize(marca, color) 3 # Va-riables de instancia 4 @marca = marca 5 @color = color6 end 7 def arranca 8 if (@engineState) 9 puts 'Motor en-cendido' 10 else 11 @engineState = true 12 puts 'Motorapagado' 13 end 14 end 15 endPosteriormente, en el archivo p031pruebamotocicleta'abrimos la clase Motocicleta y denimos el mtodo des-cribe.1 require 'p030motocicleta' 2 m = Motocicle-ta.new('Yamaha', 'rojo') 3 m.arranca 4 5 class Mo-tocicleta 6 def describe 7 puts 'El color de la motocicletaes ' + @color 8 puts 'La marca de la motocicleta es '+ @marca 9 end 10 end 11 m.describe 12 m.arranca13 puts self.class 14 puts self 15 puts Motocicle-ta.instance_methods(false).sortOtro ejemplo: en el archivo p031babreperro.rb abrimosla clase Perro que denimos anteriormente en el archivop029perro.rb y agregamos el mtodo ladra_fuerte. (Ob-serva que para poder abrir la clase, necesitamos requerirlaprimero):1 # primero necesitamos requerir el archivo 2 # dondese encuentra la denicion de la clase 3 # perro 4 re-quire 'p029perro.rb' 5 6 # abrimos de la clase y deni-mos un mtodo nuevo 7 class Perro 8 def ladra_fuerte 9

    puts 'Woof! Woof!' 10 end 11 end 12 13 # inicializamosuna instancia de la clase 14 d = Perro.new('Labrador','Benzy') 15 16 # podemos usar los metodos previamentedenidos 17 # y el que acabamos de denir 18 d.ladra 19d.ladra_fuerte 20 d.muestraSi ejecutas este programa (y has seguido paso a paso lostemas anteriores), el resultado tal vez no sea lo que tu es-peras:Intance_variables is_a? kind_of? ladra method met-hods muestra nil object_id private_methods protec-ted_methods public_methods respond_to? send single-ton_methods taint tainted? to_a to_plist to_s type untaintEl id de objeto es 280360 Lo siento, el objeto no entien-de el mensaje habla. Ru!Ru! Soy de la Raza Labra-dor y mi nombre es Benzy Soy de la Raza Labrador y minombre es Benzy Ru!Ru!Woof!Woof! Soy de la RazaLabrador y mi nombre es BenzyQu est pasando?, Por qu esa larga lista demtodos si en el archivo que estamos ejecutando(p31abreperro.rb) slo llamamos d.ladra, d.ladra_fuertey d.muestra?.La respuesta es simple pero importante: al inicio del pro-grama estamos incluyendo el archivo p029perro, por lotanto todo el codigo de ese archivo es ejecutado, no slola denicin de la clase.Observa que en el archivo p029perro.rb hacemos llama-das a mtodos que imprimen a STDOUT (ed, llaman almtodo puts).A continuacin vemos otro ejemplo en donde agregamosun mtodo a la clase String. (p032micadena).11 class String 2 def invierte 3 puts self.reverse 4 end 5end 6 cadena = La ruta nos aporto otro paso natural!" 7cadena.invierte1 El mtodo invierte no es en realidad muy til, pero sirvepara ilustrar el punto.La facilidad que tenemos de abrir cualquier clase, inclusolas clases built-in como String y Numeric es un tema me-dular en el estudio de Ruby y en la manera en que algunosprogramas en Ruby estn escritos.Rails hace uso extenso de esta caracterstica de Ruby enel mdulo ActiveSupport. De hecho, cuando eres nuevoen Ruby y en Rails, puede ser confuso identicar qu m-todos son estndar en Ruby y qu mtodos son denidospor Rails.Por ejemplo, en el archivolib/core_ext/integer/even_odd.rb, dentro de Active-Support, se encuentra la denicin del el mtodomultiple_of? dentro del mdulo EvenOdd. (En realidad,el mdulo EvenOdd est anidado dentro de otros mdu-los pero para simplicar el ejemplo, eliminamos la rutacompleta):1 module EvenOdd 2 def multiple_of?(number) 3 self %number == 0 4 end 5 end 6

  • 7Nota que hasta aqu, no se ha abierto ningu-na clase de Ruby. Sin embargo, en el archivolib/core_ext/integer/integer.rb encontramos:1 # primero el archivo even_odd es requierido 2 requi-re 'active_support/core_ext/integer/even_odd' 3 4 # se abre la clase Integer 5 class Integer 6 # se incluye el m-dulo Integer 7 # recuerda que para sipmlicar el ejem-plo, 8 # eliminamos el identicador completo del mdulo9 # EvenOdd 10 include EvenOdd 11 end 12 13 # To-ma en cuenta que esto es esencialmente lo mismo que 14# escribir: 15 # 16 # 17 # class Integer 18 # def multi-ple_of?(number) 19 # self % number == 0 20 # end 21# end 22 # 23 # Los metodos denidos en un modulo24 # son agregados como metodos de instancia 25 # acualquier clase en la que incluyamos dicho 26 # modulousando el keyword include. (mixins) 27 28ActiveSupport es un ejemplo excelente de cmo pode-mos abrir las clases en Ruby y agregar mtodos. Siquieres explorar ms en este tema, analiza la libreraFacets que contienemuchos ejemplos tiles, incluyen-do algunos de los que se usan en Rails (en particularFacets/CORE).

    16 Constructores LiteralesEsto signica que puedes usar notacin especial en lugarde llamar new para crear objetos de una clase determina-da. Las clases con constructores literales se muestran ennla siguiente tabla. Cuando usas uno de estos constructo-res literales, estas creando un nuevo objeto:Clase Constructor Ejemplo String "" nueva cadena o'nueva cadena' Symbol : :simbolo o :"simbolo con espa-cios Array [] [1,2,3,4,5] Hash {} {"Nueva York =>NY, Oregon => OR"} Range .. o ... 0...10 o 0..9Regexp // /([a-z]+)/

    17 Recoleccin de basuraLa expresin p = nil signica que no hace referencia a na-da. Si ahora escribimos p1 = nil, entonces el objeto Perroes abandonado y es elegible para la recoleccin de basu-ra. Garbage Collection (GC). En Ruby, el objeto llamadoheap destina un mnimo de 8MB. El recolector de basurade Ruby es del tipo llamado mark-and-sweep. Ruby usaun mecanismo conservador del tipo mark and sweep. Nohay garanta de que un objeto sea recolectado antes deque el programa termine.Mtodos de claseUn mtodo de clase es enviado es enviado a la clase mis-ma, no a una instancia de la clase. Algunas operacionesque pertenecen a la clase no pueden ser llevadas a cabopor instancias individuales de esa clase. new es un ejem-plo excelente.

    Llamamos Perro.new porque, hasta que hayamos creadouna instancia de clase Perro no podemos enviarle men-sajes! Adems, el trabajo de crear un nuevo objeto lgi-camente pertenece a la clase. No tiene sentido que unainstancia de la clase Perro cree a su vez instancias de sumisma clase. Sin embargo, si tiene sentido que el procesode creacin de instancias se centralizado como una acti-vidad de la clase Perro. Es de vital importancia entenderque Dig.new es un mtodo que podemos accessar a travsde la clase pero ne de las instancias de la clase.Los objetos individuales Perro (instancias de la clasePerro) no tienen acceso a este mtodo. Una clase tiene suspropios mtodos, su propio estado y su propia identidady no los comparte con sus instancias.La siguiente tabla muestra un ejemplo (tomado del libruRuby for Rails) de la notacin que se utiliza:Notacin Se reere a Boleto#precio El mtodo de instan-cia precio de la clase Boleto Boleto.mas_caro El mtodode clase mas_caro de la clase Boleto Boleto::mas_caroOtra manera de referirse al mtodo de clase mas_caroCuando escribimos acerca de Ruby, el smbolo de nme-ro(#) es utilizado algunas veces para indicar en mtodo deinstancia -por ejemplo, decimos File.chmod para denotarel mtodo de clase chmod de la clase File y File#chmodpara referirnos al mtodo de instancia que tiene el mismonombre. Esta notacin no es parte dela sintaxis de Ruby,es slo parte del folklore.

    18 HerenciaEn ruby, la herencia se maneja herencia, pero no soportamultiple herencia, por lo que cada clase solo puede teneruna superclase de la que herede comportamintos.la sintaxis es la siguiente:class ClasePadre def a_method puts 'b' end end class Cla-seCualquiera < ClasePadre # < signica hereda def anot-her_method puts 'a' end enden esta sentencia se declara una ClasePadre,con un mto-do, luego ClaseCualquiera, hija de ClasePadre con otromtodo, si hacemos lo siguiente:instance = SomeClass.new instance.another_method ins-tance.a_methodSalidaa bvemos que se aplica la herencia de mtodos correctamen-te al llamar desde una instancia hija un mtodo de la clasepadrePolimorsmoSi queremos redenir un mtodo de la clase padre en lahija, solo sobrescribimos el mtodo que deseamos rede-nir en la clase hija, de esta manera, dependiendo de el

  • 8 21 MANEJO DE EXCEPCIONES

    tipo de la instancia desde la cual llamamos al mtodo, seutilizar la correspondiente denicinAdemas, para llamar a la clase padre en cualquier mo-mento desde un hija utilizamos la palabra reservada su-per, sin embargo, si quieres acceder a un clase superior ael padre en la jerarqua de herencia(como un abuelo, di-gamos), no se puede directamente, sin embargo hay unasalida puedes darles nombre aliados a los mtodos quedeseas usar luego, como un alias!, de hecho es exacta-mente esto, veamosclass X def foo hello end end class Y < X alias xFoofoo def foo xFoo + y end end puts X.new.foo putsY.new.foo Salida hello helloy

    19 Esquema de administracin yseparacin de la Memoria

    En Construccin...

    20 Implementacin de Co-RutinasElmanejo de threads(Corrutinas) en ruby esmuy sencillo,la creacin de threads se basa en pasar un bloque a lacreacin de un objeto de la clase thread.t1 = Thread.new do 10.times do puts hello from th-read 1 sleep(0.2) end end t2 = Thread.new do 10.timesdo puts hello from thread 2 sleep(0.2) end end t1.joint2.joinPara pasar parmetros se hace de la siguiente forma:t1 = Thread.new(1) do |id| 10.times do puts hello fromthread #{id}" sleep(0.2) end end t2 = Thread.new(2) do|id| 10.times do puts hello from thread #{id}" sleep(0.2)end end t1.join t2.joinPara controlar las secciones crticas tan solo hay que cam-biar la variable de clase critical a true:counter = 0; t1 = Thread.new do 100000.times do Th-read.critical = true counter += 1 Thread.critical = fal-se end end t2 = Thread.new do 100000.times do Th-read.critical = true counter -= 1 Thread.critical = falseend end t1.join t2.join puts counter

    21 Manejo de ExcepcionesUna excepcin es una clase de objeto especial, una ins-tancia de la clase Exception o de una clase descendientede esa clase que representa una condicin especial; indi-ca que algo ha salido mal. Cuando esto ocurre, se generauna excepcin. Por defecto, los programas Ruby termi-nan cuando una excepcin ocurre pero es posible escribircdigo que maneje estas excepciones.

    Generar una excepcin signica detener la ejecucin nor-mal del programa y transferir el control al cdigo que ma-neja la excepcin en donde puedes ocuparte del problemaque ha sido encontrado o bien, terminar la ejecucin delprograma. Una de estas dos opciones (solucionar el pro-blema de alguna manera o detener la ejecucin de pro-grama) ocurre dependiendo de si has proporcionado unaclusula rescue. Si no has proporcionado dicha clusula,el programa termina, por el contrario, si la clusula existe,el control de ejecucin uye hacia esta.Ruby tiene algunas clases predenidas -descendientes dela clase Exception- que te ayudan a manejar errores queocurren en tu programa.El siguiente mtodo genera una excepcin cada vez quees llamado. El segundo mensaje nunca va a ser mostrado.1 def genera_excepcion 2 puts 'Antes de la excepcion.' 3raise 'Ha ocurrido un error' 4 puts 'Despues de la excep-cion' 5 end 6 7 genera_excepcionEl mtodo raise est denido en el mdulo Kernel. Pordefecto, raise genera una excepcin de la clase Runti-meError. Para generar una excepcin de una clase en es-pecco, puedes pasar el nombre de la clase como argu-mento al mtodo raise.1 def inverse(x) 2 raise ArgumentError, 'El argumento noes un numero' unless x.is_a? Numeric 3 1.0 / x 4 end 5puts inverse(2) 6 puts inverse('hola')Manejando una excepcin Para manejar excepciones(handle exceptions), inclumos el cdigo que pueda ge-nerar una excepcin en un bloque begin-end y usamosuna o ms clusulas rescue para indicarle a Ruby los ti-pos de excepcin que queremos manejar. Es importantenotar que el cuerpo de la denicin de un mtodo es unbloque begin-end explcito; begin es omitido y todo elcuerpo de la denicin del mtodo est sujeto al manejode excepciones hasta que aparezca la palabra end.1 def genera_y_rescata 2 begin 3 puts 'Estoy antes de rai-se.' 4 raise 'Ha ocurrido un error.' 5 puts 'Estoy despuesde raise.' 6 rescue 7 puts 'He sido rescatado.' 8 end 9 puts'Estoy despues de begin.' 10 end 11 genera_y_rescataObserva que el cdigo interrumpido por la excepcinnunca es ejecutado. Una vez que la excepcin es resca-tada, la ejecucin contina inmediatamente despus delbloque begin que la gener.Puedes apilar clusulas rescue en un bloque begin-end.Las excepciones que no sean manejadas por una clusularescue uirn hacia la siguiente:1 begin 2 # ... 3 rescue UnTipoDeExcepcion 4 # ... 5 res-cue OtroTipoDeExcepcion 6 # .. 7 else 8 # Otras excep-ciones 9 endPara cada clusula rescue en el bloque begin, Ruby com-para la excepcin generada con cada uno de los parme-tros en turno. La ocurrencia tiene xito si la excepcinnombrada en la clusula rescue es del mismo tipo que la

  • 9excepcin generada. El cdigo en una clusula else es eje-cutado si el cdigo en la expresin begin es ejecutado sinexcepciones. Si una excepcin ocurre, entonces la clusu-la else no es ejecutada. El uso de una clusula eles no esparticularmente comn en Ruby. Si quieres interrogar auna excepcin rescatada, puedes asignar el objeto de cla-se Exception a una variable en la clusula rescue, comose muestra en el programa p046excpvar.rb1 begin 2 raise 'Una excepcion.' 3 rescue Exception => e4 puts e.message 5 puts e.backtrace.inspect 6 endLa clase Exception dene dos mtodos que regresan de-talles acerca de la excepcin. El mtodo message regresauna cadena que puede proporcionar detalles legibles acer-ca de lo que ocurri mal. El otro mtodo importante esbacktrace. Este mtodo regresa un array de cadenas querepresenta la pila de ejecucin hasta el punto en que laexcepcin fue generada. Si necesitas garantizar que al-gn proceso es ejecutado al nal de un bloque de cdigosin importar si se gener una excepcin o no, puedes usarla clusula ensure. ensure va al nal de la ltima clusularescue y contiene un bloque de cdigo que siempre va aser ejecutado.Excepciones con Manejo de ArchivosEjemplo:1 # Abrir un archivo y leer su contenido 2 # Nota que yaque est presente un bloque, el archivo 3 # es cerrado au-tomaticamente cuando se termina la ejecucion 4 # del blo-que 5 begin 6 File.open('p014estructuras.rb', 'r') do |f1| 7while linea = f1.gets 8 puts linea 9 end 10 end 11 12 #Crer un archivo y escribir en el 13 File.open('prueba.txt','w') do |f2| 14 f2.puts Creado desde un programa Ruby!"15 end 16 rescue Exception => msg 17 # mostar el men-saje de error generado por el sistema 18 puts msg 19 end

    22 Gramtica en EBNF del Len-guaje

    En Construccion

    23 Caractersticas Especiales delLenguaje

    Caracteristicas de Ruby-Todo es un objetoEn ruby, se combinan las capacidades de los lenguajesfuncionales con las de los lenguajes imperativos orienta-dos a objetos, de esta manera cada elemento en ruby tie-ne un compartimiento similar, pero personalizado paralas conveniencias de cada usuario. Tanto asi que inclu-so se pueden escribir metodos a nmeros que escribimosnormalmente, es decir podemos hacer:

    5.times print { Ruby es lo mejor }-BloquesFuncionalidad traspasada de los lenguajes funcionales,uno puede escribir un bloque de cdigo llamado clusulaa cualquier mtodo, para describir como debe actuar.-La apariencia visual de RubyA pesar de que Ruby utiliza la puntuacin muy limitada-mente y se preeren las palabras clave en ingls, se utilizaalgo de puntuacin para decorar el cdigo. Ruby no nece-sita declaraciones de variables. Se utilizan convencionessimples para nombrar y determinar el alcance de las mis-mas. var puede ser una variable local. @var es una variable de instancia. $var es una variable globalEstos detalles mejoran la legibilidad permitiendo que eldesarrollador identique fcilmente los roles de las varia-bles. Tambin se hace innecesario el uso del molesto self.como prejo de todos los miembros de instancia.-Ademas Ruby adems posee otras funcionalidadespara aclarar la vida los programadores, entre la cuales es-tan: Manejo de Excepciones Mark and Sweep Garbage collectorMucho soporte para comunicacin con C, con un agra-dable API para utilizar Ruby desde CManejo de multitareas (Threads) independiente del sis-tema operativo, puedes incluso usar threads en DOS! Gran Portabilidad, corre en toda clase de sistemas Li-nux/Unix, Windows, OS/2, dos, etc

    24 Ejemplos del LenguajeEjemplo 1puts Hello World print 'Enter your name: ' name= getsputs Hello #{name}" 5.times { puts Hola }Ejemplo 2'class Mamifero def respira puts inhala y exhala end endclass Gato

  • 10 26 REFERENCIAS

    do desde un programa Ruby!" end rescue Exception =>msg # mostar el mensaje de error generado por el sistemaputs msg endp014estructuras.rb var = 5 if var > 4 puts La variablees mayor que 4 puts Puedo tener muchas declaracionesaqui if var == 5 puts Es posible tener if y else anida-dos else puts Too cool end else puts La variable noes mayor que 4 puts Puedo tener muchas declaracionesaqui end # Loops var = 0 while var < 10 puts var.to_svar += 1 end

    25 Enlaces Externos Ruby Sitio principal de Ruby en Internet. Ruby central Recursos sobre Ruby en Ingls. Rubes Comunidad hispana de usuarios de Ruby. Ruby Tutorial tutorial en castellano de Ruby. Programming Ruby, David Thomas y AndrewHunt.Libro libre

    Ruby Argentina Comunidad Argentina de Ruby RubyLit Comunidad del Litoral Argentino de Ruby Full Ruby on Rails Tutorial NetBEANS IDE Ruby Tutorial Programa Hola Mundo! Palabras Reservadas

    26 Referencias

    [1] Historia

  • 11

    27 Text and image sources, contributors, and licenses27.1 Text

    Programacin en Ruby Fuente: http://es.wikibooks.org/wiki/Programaci%C3%B3n%20en%20Ruby?oldid=210079 Colaboradores:Oleinad, Morza, Grupo Ruby, Wikimi-dhiann, Mjbmrbot, TheOrlSan, Ralgisbot y Annimos: 5

    27.2 Images Archivo:Book_notice.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f1/Book_notice.svg Licencia: CC BY-SA 3.0

    Colaboradores: Transferred from en.wikibooksArtista original: Original uploader was Darklama at en.wikibooks

    Archivo:Dialog-information_on.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/e/e7/Dialog-information_on.svg Licen-cia: CC BY-SA 2.5 Colaboradores:

    Dialog-information.svg Artista original: Dialog-information.svg: The people from the Tango! project

    27.3 Content license Creative Commons Attribution-Share Alike 3.0

    Introduccin ndice Historia Tutorial de Instalacin Programa Hola Mundo!"

    Diccionario de Palabras Reservadas, Operadores y Smbolos del Lenguaje Nmeros Strings Date/Time Operaciones de Entrada y Salida Tipos de datos Complejos Declaracin e inicializacin de Variables Tabla de Operadores con Asociatividad y Precedencia Estructuras de Decisin e Iteracin Declaracin, definicin y uso de Mtodos y Funciones Implementacin y uso de la Programacin Orientada a Objetos Constructores Literales Recoleccin de basura Herencia Esquema de administracin y separacin de la Memoria Implementacin de Co-Rutinas Manejo de Excepciones Gramtica en EBNF del Lenguaje Caractersticas Especiales del Lenguaje Ejemplos del Lenguaje Enlaces Externos Referencias Text and image sources, contributors, and licensesTextImagesContent license