Primera vez con Ruby

El viernes por la tarde salí del trabajo y me fuí a escuchar la charla de César Ballardini, El modelo de objetos de Ruby, reflexiones sobre la reflexión. La daba en el marco del evento acts_as_rubylit, el cual se llevó a cabo en la Facultad de Ingeniería y Ciencias Hídricas, Universidad Nacional del Litoral de la ciudad de Santa Fe.

Nunca antes vi nada de Ruby. Bueno, casi, pero la última vez no pasé del Hola Mundo!juanjo_ruby_800

César empezó su charla explicando la Paradoja de Blub, de Paul Graham. Blub es un lenguaje de programación hipotético. No es el lenguaje de programación más poderoso, pero tampoco es Cobol o lenguaje de máquina. Un programador Blub está parado más o menos en el medio de la ladera de una montaña; hacia abajo están los lenguajes menos poderosos que Blub, él se da cuenta de esto, por supuesto, a todos esos lenguajes le faltan distintas características que nuestro programador usa en Blub para resolver sus problemas. En cambio, cuando mira para arriba (y ve lenguajes más poderosos que Blub), en realidad no se da cuenta que está mirando hacia arriba, simplemente piensa que está mirando a unos locos, hippies de pelos parados haciendo cosas raras. Cuando los programadores que están más arriba en la montaña miran hacia Blub se pregunta, ¿cómo puede alguien estar usando Blub? Ni siquiera tiene la funcionalidad X tan útil para resolver Y!

Por inducción se concluye que solo el programador que esté en la punta de la montaña, es decir el que conoce el lenguaje más poderoso, es capaz de distinguir las distintas posibilidades que se tienen con diferentes lenguajes. El programador Blub no puede verlo, por lo que solo sabe pensar en Blub, no se a enfrentado a problemas que le permitan pensar diferente.

La moraleja de la historia es que uno debería aprender lenguajes que lo obliguen a cambiar su forma de pensar y de resolver problemas (Alan J. Perlis).

Con esto terminó la primera parte de la charla, luego César hizo una explicación de pizarrón sobre qué es la Programación Orientada a Objetos ( y escribió con su fibrón: un objeto tiene Identidad, encapsula Estado y define Comportamiento). Según César, es un error que en la enseñanza de la POO se empiece por las Clases. ¿En qué parte de “Programación Orientada a Objetos” dice “Clase”? Las clases son solo una forma de crear objetos, pero hay muchas otras. Por ejemplo, existen muchos lenguajes OO basados en prototipos, como JavaScript.

Después de haber shockeado a la audiencia desarrollando estas dos ideas en un tono casi de declaración de principios, estábamos listos para ver cómo el Modelo de Objetos de Ruby podía cambiar nuestra forma de pensar.
Lo que sigue no son los ejemplos exactos que desrrolló César con su notebook, solo los que recuerdo. Mezclo los recuerdos de su sesión interactiva de Ruby con mi propio camino de aprendizaje, que arranca ni siquiera teniendo el intérprete instalado :)

Para empezar los ejemplos, tipeó en la terminal

irb

. Hice lo mismo, pero no estaba instalado, por lo que instalé ese paquete y presté atención a sus dependencias:
juanjo@fenix:~$ irb
El programa «irb» no está instalado actualmente. Puede instalarlo escribiendo:
sudo apt-get install irb
bash: irb: orden no encontrada
juanjo@fenix:~$ sudo apt-get install irb
[sudo] password for juanjo:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
irb1.8 libreadline-ruby1.8 ruby1.8
Paquetes sugeridos:
ruby1.8-examples rdoc1.8 ri1.8
Se instalarán los siguientes paquetes NUEVOS:
irb irb1.8 libreadline-ruby1.8 ruby1.8
0 actualizados, 4 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 119kB de archivos.
Se utilizarán 664kB de espacio de disco adicional después de esta operación.
¿Desea continuar [S/n]?
Des:1 http://ar.archive.ubuntu.com jaunty-updates/main ruby1.8 1.8.7.72-3ubuntu0.1 [24,0kB]
Des:2 http://ar.archive.ubuntu.com jaunty-updates/universe libreadline-ruby1.8 1.8.7.72-3ubuntu0.1 [10,4kB]
Des:3 http://ar.archive.ubuntu.com jaunty-updates/universe irb1.8 1.8.7.72-3ubuntu0.1 [79,1kB]
Des:4 http://ar.archive.ubuntu.com jaunty/universe irb 4.2 [5138B]
Descargados 119kB en 2s (58,0kB/s)
Seleccionando el paquete ruby1.8 previamente no seleccionado.
(Leyendo la base de datos ...
248649 ficheros y directorios instalados actualmente.)
Desempaquetando ruby1.8 (de .../ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...
Seleccionando el paquete libreadline-ruby1.8 previamente no seleccionado.
Desempaquetando libreadline-ruby1.8 (de .../libreadline-ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...
Seleccionando el paquete irb1.8 previamente no seleccionado.
Desempaquetando irb1.8 (de .../irb1.8_1.8.7.72-3ubuntu0.1_all.deb) ...
Seleccionando el paquete irb previamente no seleccionado.
Desempaquetando irb (de .../apt/archives/irb_4.2_all.deb) ...
Procesando disparadores para man-db ...
Procesando disparadores para menu ...
Configurando ruby1.8 (1.8.7.72-3ubuntu0.1) ...
Configurando libreadline-ruby1.8 (1.8.7.72-3ubuntu0.1) ...
Configurando irb1.8 (1.8.7.72-3ubuntu0.1) ...

Configurando irb (4.2) ...
Procesando disparadores para menu ... Entonces irb no es Ruby. ¿Qué es?
NAME
irb1.8 - interactive ruby

SYNOPSIS
irb [options]

DESCRIPTION
irb stands for ‘interactive ruby’. irb is a tool to execute interactively ruby expressions read from stdin. Use of irb is easy if
you know ruby. Executing irb, prompts are displayed as follows. Then, enter expression of ruby. A input is executed when it is
syntacticaly completed
.

Ahora si puedo empezar!

Objetos y mensajes

Un lenguaje OO consta de objetos y mensajes entre objetos. Algunas veces los mensajes están un poco camuflados, pero siempre están ahí:

irb(main):001:0> 1 + 2
=> 3
irb(main):002:0> 1.+ 2
=> 3
irb(main):003:0> 1.+(2) # para los lisperos que extrañan los paréntesis
=> 3

Identidad

Enviando el mensaje

object_id

, podemos preguntarle su identidad a un objeto:

irb(main):001:0> 1.object_id
=> 3
irb(main):002:0> "hola".object_id
=> -605926728

Clases

Enviando el mensaje

class

a un objeto, podemos preguntarle quién es su clase:

irb(main):005:0> 1.class
=> Fixnum
irb(main):006:0> 1.class.class
=> Class
irb(main):007:0> 1.class.class.class
=> Class

Podemos ver que la clase Fixnum es una instancia de la clase Class; y la clase Class también es instancia de la clase Class.
Enviando el mensaje

superclass

a una clase, podemos saber cual es su superclase, es decir, qué clase extiende.

irb(main):010:0> 1.class.superclass
=> Integer
irb(main):011:0> 1.class.superclass.superclass
=> Numeric
irb(main):012:0> 1.class.superclass.superclass.superclass
=> Object

Luego, la clase de Object es obviamente Class, pero… ¿cuál es su superclase?

irb(main):019:0> 1.class.superclass.superclass.superclass
=> Object
irb(main):020:0> 1.class.superclass.superclass.superclass.superclass
=> nil

Creo recordar que en SmallTalk también era así. Parece un chiste de los diseñadores :) nil ni siquiera es una clase:

irb(main):021:0> 1.class.superclass.superclass.superclass.superclass.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
	from (irb):21
	from :0
irb(main):022:0> 1.class.superclass.superclass.superclass.superclass.class
=> NilClass
irb(main):023:0> 1.class.superclass.superclass.superclass.superclass.class.superclass
=> Object
irb(main):024:0> 1.class.superclass.superclass.superclass.superclass.class.class
=> Class

y la jerarquía de clases se cierra. Es para leer tranquilo y pensarlo.

El resto de la charla abarcó varias cosas más, pero creo que sería demasiado para desarrollarlo en un post y lo que mostré ya es suficiente para abrirle el apetito a los que estén buscando algún lenguaje para aprender y les produzca un cambio en su forma de pensar :) . Si César postea sus ejemplos, los voy a estar referenciando desde aquí o voy a intentar hacer uno o dos posts más.

Gracias al Grupo de Usuarios de Ruby del Litoral por organizar el evento!

Acerca de Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar.
Esta entrada fue publicada en Eventos y etiquetada . Guarda el enlace permanente.
  • ¡Increible post!

    Desconocía la paradoja de Blub. La verdad es que te abre los ojos cuando estás metido en un lenguaje y no crees que haya otro mejor.

    Un saludo!
  • Ultimamente Ruby es mi lenguaje favorito, pero realmente me *duele* cuando lo estoy usando ver que esta tan cerca del nirvana que es Smaltalk sin lograr llegar. Tan cerca.
  • Juanjo
  • Juan Fisanotti
    Hey! estuviste en las charlas de act_as_rubylit? Yo también anduve ahí :)

    Muy buen post.
  • Juanjo
    Actualicé la cita requerida para "uno debería aprender lenguajes que lo obliguen a cambiar su forma de pensar y de resolver problemas". La cita original es "A language that doesn't affect the way you think about programming, is not worth knowing." y apareció en la lista de epigramas Alan J. Perlis, un científico computacional de la Universidad de Yale, primer ganador del premio Turing de ACM.
  • Sí, había leido que era uno de los favoritos. Pero una cosa es tener un lenguaje como favorito y luego implementar otro lenguaje que se le parezca. Hay varios lenguajes (como Java) que venían fuertemente ligados a la idea de Smalltalk. Self, el predecesor de Java era muy similar. Sin embargo se fueron relajando algunas cosas.

    Lo que destaco de cada uno de estos lenguajes que se "atan" a un paradigma, es que con reglas simples definen el lenguaje. La interfaz, el conjunto de objetos, mensajes con los que uno interactúa dependen de cada sistema. Hay muy buenas charlas de Alejandro Reimondo al respecto (smalltalking.net).
  • Javier
    Nacho, uno de los lenguajes favoritos del creador de ruby es el smalltalk por eso la similitud. Saludos!
  • Muy buen post! Un abrazo!
  • La montaña de lenguajes es un poco complicada por que tiene tres puntas: Lisp, Haskell y Smalltalk. No esta muy claro si alguna es mas alta que las otras. Lo que si esta claro es que son puntas así que para pararce ahi hace falta hacer equilibrio (y por lo visto no hay mucho lugar tampoco).
  • Muy buen post! Qué lástima que no pude asistir al evento.
  • Smalltalk revive :-D
    Una vez me puse a jugar con Ruby, con ejemplos muy similares y me sorprendió su similitud con Smalltalk. Al parecer el marketing detrás de este lenguaje lo hizo más famoso.

    Buen post Juanjo !
blog comments powered by Disqus