viernes, 28 de noviembre de 2008

TODO es un objeto

Veamos una de las características de Ruby. En esta ocasión le toca a:

En Ruby todo es un objeto

Se dice que nunca hay que ser tan categórico, pero Ruby es así. Comparte este paradigma con otros lenguajes como Smalltalk.

En este lenguaje que nos ocupa no existen tipos simples como int, float, unsigned, char, ni otros similares que aparecen en otros lenguajes. Todo es un objeto, pero se trata de un modo tan transparente que no notas diferencia si no experimentaste con ello. De este modo, se pueden hacer cosas como

12.times { puts "Creo que estoy siendo repetitivo"}

El código de ejemplo saca por pantalla la frase "Creo que estoy siendo repetitivo" 12 veces. Puedes fijarte que se está llamando al método times del objeto 12, que es una instancia de la clase Fixnum (la que en otros lenguajes podría llamarse Integer).

Es una manera realmente transparente de usar objetos: parece un tipo simple, está ahí, nadie ha invocado al constructor de Fixnum, pero por debajo es un objeto. Esta solución es una alternativa mejor, a mi ver, que las clases envoltorio de Java.

Comenzando en Ruby: Hola mundo

Entremos en materia. Ruby es un lenguaje fácil de cojerle el tranquillo, ya que tiene suficientes parecidos con otros lenguajes que puedes conocer que puedes desarrollar con el rápido. Después usar funcionalidades nuevas para ti costará más, como por ejemplo la metaprogramación para gente que venga de Java, o el mero hecho de ser orientado a objetos puro para usuarios de C++ o Java.

Como tiene que ser, la primera muestra del lenguaje debe ser un Hola mundo.

Bienvenidos a Ruby:

puts "Hola Mundo"

Ahí lo teneis. Fácil a más no poder. Pones eso en un fichero .rb y el intérprete ya sacará por pantalla la manida frase.

Vamos a ir un paso más allá: Que la aplicación me pregunte el nombre y me salude:

print "Hola guapo, ¿como te titulas?: "
nombre = gets
puts "Hola #{nombre}"


Aquí se puede ver la primera cosa que puede resultar extraña. Si vienes de Java, C, C++, C# y demás lenguajes te vendrá una pregunta a la cabeza: ¿Dónde están los malditos paréntesis? En ruby son opcionales, salvo en algunos casos que se ponen por ambigüedades. Se aconseja ponerlos, aunque a yo no los suelo poner (disculpadme si os cuesta más seguirme). Para los que no lo veais, el mismo código con parentesis es este:

print("Hola guapo, ¿como te titulas?: ")
nombre = gets()
puts("Hola #{nombre}")


¿Así mejor? Se ve que print, gets y puts son métodos. Adelanto que son de Kernel, uno de los padres de todas las clases en Ruby (en otro post se hablará de todo esto).

Otra cosa diferente es que no se dice que tipo es nombre, en otros lenguaje se le pondría delante. En Ruby se usa el tipado dinámico, asi que nombre será lo que gets le dé. De hecho, no importa la clase que sea, porque lo que importa es su comportamiento. Es la llamada Duck Typing:
Si camina como un pato, nada como un pato y hace "quack", podemos tratarlo como un pato.
De este modo me da igual que nombre sea un String, un pato, un coche o una excepción. Lo que importa es que pueda mostrarse como texto. Igual queda un poco chapucero explicado, así que dedicaré otro post a dejar clara esta filosofía

Está quedando un post demasiado largo, de modo que paro aquí. Dudas o correcciones en los comentarios. Si has llegado leyendo hasta aqui, muchas gracias.

FAQ

Habrá que empezar las anotaciones desde el principio, para tener toda la información posible, así que haré un pequeño faq acerca del lenguaje.

¿Que demonios es Ruby?
Ruby es un lenguaje de programación interpretado, reflexivo 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. [Wikipedia]

Vale, otro más. Fijo que se mató el Matz ese. ¿A que lenguajes se parece?
Combina una sintaxis inspirada en Python, Perl con características de programación orientada a objetos similares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. [Wikipedia]

Ya sé que es japonés, pero por algo haría el lenguaje (además de ser raro como todos los japos)
Efectivamente lo hizo por algo. Él mismo dice esto:
A menudo la gente, especialmente los ingenieros en informática, se centran en las máquinas. Ellos piensan, "Haciendo esto, la máquina funcionará más rápido. Haciendo esto, la máquina funcionará de manera más eficiente. Haciendo esto..." Están centrados en las máquinas, pero en realidad necesitamos centrarnos en las personas, en cómo hacen programas o cómo manejan las aplicaciones en los ordenadores. Nosotros somos los jefes. Ellos son los esclavos.
La idea que tuvo es hacer un lenguaje de programación divertido, en el que el programador se sienta cómodo programando, y que tenga un desarrollo ágil. Esta es su aportación al mundo.

Ajá, bueno, todo en la vida hay que probarlo. ¿Donde hay un compilador, o algún IDE?
Bueno, Ruby no es un lenguaje compilado, sino interpretado de una sola pasada, así que de compiladores nada. Se distribuye para usarlo una interprete de comandos en el que puedes ir programando y viendo los resultados en el acto, es fxri. Por aqui puedes bajar todo lo necesario.

Respecto a IDEs, hay alguno, hay algún plugin de Eclipse, pero no he probado nada. He usado siempre el Notepad++ (recomendadísimo si desarrollas software) que incluye Ruby.

¿Y eso otro, Ruby on Rails?
Es el framework de desarrollo web de Ruby, cuando llegue a pelearme con él haré su faq.

¿Y no metes ni una linea de código aquí?
Esperate al siguiente post, cansino.

Según pase el tiempo modificaré y añadiré preguntas al faq, para que este curioso.

Joyas de Ruby

Conmienzo la publicación del blog Joyas de Ruby, en el que albergaré todas esas cosas que vaya aprendiendo del lenguaje de programación Ruby y su framework web, Ruby on rails.

Con este blog pretendo tener todos mis conocimientos fácilmente accesibles por si se me olvida algo, y para cualquier persona que se enfrente al lenguaje y le puedan valer mis anotaciones.

Soy un casi-ingeniero técnico en informática que vaa desarollar su proyecto final de carrera en este lenguaje, y estoy aprendiendo a usarlo ahora por primera vez.

Tengo experiencia en otros lenguajes de programación, aunque ninguno es orientado a objetos puro como éste (Java, C, C++, Haskell, PHP, ...). También tengo algo de experiencia en frameworks web (Struts2, JSF, ASP.NET).

Invito a todo el que encuentre este blog y le interese que lo lea, ya que nunca se sabe de dónde se puede sacar una buena idea, o conocer una funcionalidad de un lenguaje como este, que se presta a las florituras (con los bloques de código, ...).