Nuestro primer programa en Ruby

Empecemos por abrir nuestro editor SciTE. En el escritorio de Windows, haz click en Inicio/Programas/Ruby-186-25/SciTE para abrir una ventana del editor. Haz click en Options/Open Global Options File y busca tabsize y edítalo para que quede: tabsize=2, indent.size=2.

Scite Conf

A mi me gusta que la ventana de SciTE esté maximaizada al inicio. Para eso configura estos valores:

position.width=-1
position.height =-1

Presiona Ctrl+s, Ctrl+w y a continuación Ctrl+Shift+l para abrir la ventana Indentation Settings (configuración de indentación) y asegúrate que los valores de Tab Size y de Indent Size sean 2 y de que la opción Use Tabs no esté seleccionada. Presiona OK. Ahora ya estamos listos para escribir nuestro primer programa en Ruby.

Crea un folder que se llame, digamos, programasruby en C:\. Aquí vamos a almacenar todos nuestros programas. Nuestro primer programa va a desplegar la cadena ‘Hola’ en la ventana de comandos. El nombre del pragrama va a ser p001hola.rb.

En Ruby, todos los archivos fuente tienen la extensíon .rb. Una de las convenciones de Ruby estipula que el nombre del archivo/directorio debe ser el mismo de la clase/módulo en minúsculas y con la extensión .rb. Por ejemplo, el archivo en que se declara la clase Foo se llama foo.rb

En la ventana izquierda del editor SciTE escribe:

1 puts 'hola'

haz click en File/Save As… y dale el nombre p001hola.rb. A continuación presiona F5 para ejecutar el programa. Debes ver la palabra Hola en la ventana de la derecha.

Hola

Nota: De manera genral, la ejecución de programas en Ruby procede de arriba hacia abajo. puts (la ’s’ en el comando puts representa la palabra string. puts es en realidad put string ) simplemente escribe en la pantalla lo que sea que continúe después del comando y automáticamente avanza a la siguiente línea.

En Ruby, todo, desde un número hasta una cadena, es un objeto (más al respecto más adelante) y cada objeto cuenta con métodos (término que se usa en Ruby para referirse a funciones)1 predeterminados que pueden ser usados para hacer muchas cosas útiles con los objetos. Para usar un método, es necesario poner un punto después del nombre del objeto y luego agregar el nombre del método.

Algunos métodos como puts y gets están disponibles desde cualquier lugar en el programa y no necesitan ser asociados explícitamente con algún objeto en específico. Técnicamente hablando, estos métodos están disponibles gracias al módulo Kernel (más al respecto más adelante) y son incluídos en todos los objetos (el módulo Kernel es incluído por la clase Object, de tal manera que sus métodos están disponibles para cada objeto de Ruby).

Cuando tu ejecutas una aplicación Ruby, un objeto llamado main de la clase Object es creado automáticamente. Este objeto proporciona acceso a los métodos del módulo Kernel.2

Lo anterior pude ser verificado siguiendo el siguiente programa (nuevamente, no te preocupes si no lo entiendes todo por ahora):

1 puts'Yo soy un objeto de la clase = ' + self.class.to_s
2 puts 'Yo soy un objeto = ' + self.to_s
3 puts 'Los métodos del objeto son: '
4 puts self.private_methods.sort

Observa

  • Programadores Java y C: no hay necesidad de una función main.
  • Las cadenas son secuencias de caracteres entre comillas sencillas o dobles. Estoy usando commillas simples al rededor de Hola. ’ es más eficiente que ” (mas al respecto más adelante).
  • Ruby es un lenguaje interpretado, asi que no tienes que compilar para ejecutar un programa escrito en Ruby.
  • Una de las canvenciones de Ruby estipula que el nombre del archivo/directorio debe ser el mismo que el de la clase/módulo, en minúsculas y con la extensión .rb. Por ejemplo, el archivo en que se declara la clase Foo se llama foo.rb

1 Los métodos en Ruby son mucho más interesantes que una función en PHP, por ejemplo. Si bien los podemos usar de una manera muy similar, lo interesante es cuando empezamos a pensar en ellos como mensajes que son enviados a un objeto (este concepto viene de Smalltalk y es de lo más divertido):

1 perro.ladra

Efectivamente, le estamos pidiendo a un perro que ladre.

2 Esto sólo es parte de lo que realmente sucede. En el texto original, Satish escribe: The Kernel module is included by the class Object. La traducción literal es: “El módulo Kernel es incluído por la clase Object.”

Sin embargo, la expresión en inglés debería decir: class Object mixes in module Kernel, que se traduce en “la clase Object incorpora al módulo Kernel”.

La diferencia es muy sutil y se podría argumentar que es sólo un asunto de semántica. Puede ser, pero es importante hacer una aclaración:

Ruby ofrece un punto intermedio entre herencia múltiple y única a través de mixins. Básicamente lo que sucede es que un grupo de métodos son definidos en un módulo que después es incorporado a una o varias clases a través de la declaración include. Las instancias (u objetos) de esa clase pueden entonces interactuar con las métodos definidos en el módulo.

No te preocupes si todo esto hace que tu cabeza de vueltas. Aunque el tema de herencia (del cual son parte crucial los mixins) es central en Ruby, no es necesario entenderlo del todo por ahora. Vamos por partes.