Programando en Ruby

La Guía de los "Programadores Pragmáticos"

Preface



Este libro es un tutorial y referencia para el lenguaje de programación Ruby. Utiliza Ruby y escribirás mejor código, serás más productivo y te divertirás más programando.

Estas son afirmaciones atrevidas, pero creemos que después de leer este libro estarás de acuerdo con ellas. Y nosotros tenemos la experiencia que respalda estas afirmaciones.

Como Programadores Pragmáticos hemos probado muchos, muchos lenguajes en nuestra búsqueda de herramientas que hagan nuestra vida más fácil, de herramientas que nos ayuden a hacer nuestros trabajos mejor. Hasta ahora, sin embargo, siempre estuvimos frustrados por los lenguajes que estabamos utilizando.

Nuestro trabajo es resolver problemas, no resolver la vida a los compiladores, así que nosotros queremos lenguajes dinámicos que se adapten a nosotros, sin arbitrariedades ni rígidas reglas. Necesitamos claridad para que podamos comunicarnos utilizando nuestro código. Valoramos la concisión y la habilidad de expresar un requerimiento en código de manera exacta y eficiente. Cuanto menos código escribimos, menos podemos fallar. (Y nuestras muñecas y dedos también nos lo agradecerán.)

Nosotros queremos ser tan productivos como sea posible, así que queremos que nuestro código se ejecute a la primera; el utilizado en el depurador es tiempo robado del tiempo de desarrollo. También ayuda si podemos probar el código mientras lo editamos; si tienes que esperar dos horas para completar el ciclo, podrías también utilizar tarjetas perforadas y enviar tu trabajo para una compilación por lotes.

Queremos un lenguaje que trabaje en un alto nivel de abstracción. A mayor nivel del lenguaje, menos tiempo gastamos traduciendo nuestros requerimientos en código.

Cuando descubrimos Ruby, nos dimos cuenta de que habíamos encontrado lo que estábamos buscando. Más que cualquier otro lenguaje con el que hayamos trabajado, Ruby está fuera de tu camino. Puedes concentrarte en solucionar el problema, en vez de pelear con el compilador y asuntos del lenguaje. Así es como puede ayudarte a convertirte en un mejor programador: dándote la oportunidad de gastar tu tiempo creando soluciones para tus usuarios, no para el compilador.

Destellos de Ruby

Coje un auténtico lenguaje orientado a objetos, como Smalltalk. Quita la sintaxis poco familiar y muévelo hacia un código fuente más convencional basado en ficheros. Ahora añade en gran cantidad la flexibilidad y comodidad de lenguajes como Python y Perl.

Terminas con Ruby.

Los aficionados a la orientación a objetos encontrarán en Ruby mucho de lo que les gusta: cosas como total orientación a objetos (todo es un objeto), metaclases, cierres, iteradores y omnipresentes colecciones heterogéneas. Los usuarios de Smalltalk se sentirán como en casa (y los usuarios de C++ y Java sentirán envidia).

Al mismo tiempo, los magos de Perl y Python encontrarán muchas de sus características favoritas: completo soporte a expresiones regulares, fuerte integración con el sistema operativo, cómodos atajos y evaluación dinámica.

Ruby es fácil de aprender. Las tareas diarias son fáciles de codificar, y una vez hecho, son fáciles de mantener y ampliar. Cosas aparentemente dificultosas dejan de serlo después de todo. Ruby sigue el Principio de la Menor Sorpresa--- las cosas funcionan del modo en que esperas que lo hagan, con muy pocos casos especiales o excepciones. Y eso realmente constituye una diferencia cuando estás programando.

Nosotros llamados a Ruby un lenguaje transparente. Con eso queremos decir que Ruby no oculta las soluciones que escribes tras montones de sintaxis y la necesidad utilizar montones de código de soporte para hacer que funcionen las cosas. Con Ruby escribes programas cercanos al domino del problema. En vez de tener que mapear constantemente tus ideas y diseños en el nivel pedestre de la mayoría de los lenguajes, con Ruby encontrarás que puedes expresarlos directamente y expresarlos con elegancia. We call Ruby a transparent language. Esto significa que codificas más rápido. También significa que tus programas permanecen comprensibles y mantenibles.

Utilizando Ruby, nos sorprendemos constantemente de cuanto código podemos escribir de una sentada, código que funciona a la primera. Hay muy pocos errores de sintaxis, sin violaciones de tipos, y muchos menos errores de lo habitual. Esto tiene sentido: hay menos en lo que fallar. Sin molestos puntos y comas a teclear mecánicamente al final de cada línea. Sin problemáticas declaraciones de tipo a mantener sincronizadas (especialmente en ficheros separados). Sin palabras innecesarias sólo para tener contento al compilador. Using Ruby, we are constantly amazed at how much code we can write in one sitting, code that works the first time. There are very few syntax errors, no type violations, and far fewer bugs than usual. This makes sense: there's less to get wrong. No bothersome semicolons to type mechanically at the end of each line. No troublesome type declarations to keep in sync (especially in separate files). No unnecessary words just to keep the compiler happy. Sin entramados de código propensos al error.

¿Así que por qué aprender Ruby? Porque creemos que te ayudará a programar mejor. Te ayudará a centrarte en el problema, con menos distracciones. Hará tu vida más fácil.

¿Qué Tipo de Lenguaje es Ruby?

En los viejos tiempos, la distinción entre lenguajes era simple: eran compilados, como C o Fortran, o interpretados, como BASIC. Los lenguajes compilados te daban velocidad y acceso a bajo nivel; los lenguajes interpretados eran de más alto nivel pero más lentos.

Los tiempos cambian, y las cosas ya no son tan simples. Algunos diseñadores de lenguajes han llamado a sus creaciones ``lenguajes de script''. Con esto, imaginamos que quieren decir que sus lenguajes son interpretados y que pueden ser utilizados para reemplazar los ficheros de ejecución por lotes y los script de shell, orquestando el comportamiento de otros programas y del sistema operativo. Perl, TCL y Python han sido todos ellos denominados lenguajes de script.

¿Qué es exactamente un lenguaje de script? Francamente no sabemos si es una distinción que merece la pena ser hecha. en Ruby, puedes acceder a todas las características del sistema operativo. Puedes hacer el mismo tipo de cosas en Ruby que en Perl o Python, y puedes hacerlo más claramente. Pero Ruby es esencialmente diferente. Es un auténtico lenguaje de programación, también, con fuertes raíces teóricas y una ligera y elegante sintaxis. Tu podrías poner juntos un revoltijo de ``scripts'' con Ruby, pero probablemente no lo harías. En cambio, estarías más inclinado a desarrollar una solución, a crear un programa que es fácil de entender, simple de mantener, y un juego de niños de extender y reutilizar en el futuro.

Aunque hemos utilizado Ruby para trabajos de script, la mayoría de las veces lo utilizamos como un lenguaje de propósito general. Lo hemos utilizado para escribir aplicaciones con interface gráfica de usuario y procesos intermedios de servidor, y lo estamos utilizando para formatear grandes partes de este libro. Otros lo han utilizado para gestionar servidores y bases de datos. Ruby está sirviendo páginas web, comunicándose con bases de datos y generando contenido dinámico. Hay gente escribiendo inteligencia artificial y programas de maquinas de aprendizaje in Ruby, y hay al menos una persona que lo está utilizando para investigar evolución natural. Ruby está encontrando un hogar como un vehículo para investigar matemáticas. Y gente por todo el mundo está utilizándolo como un modo de pegar juntas un montón de aplicaciones diferentes. Es ciertamente un gran lenguaje para producir soluciones en una amplia variedad de dominios de problemas.

¿Es Ruby para Mi?

Ruby no es la panacea universal para los problemas de los programadores. Siempre habrá ocasiones en las que necesitarás un lenguaje en particular: el entorno podría dictartelo, podrías tener que utilizar librerías especiales, consideraciones de rendimiento, o simplemente un tema con el entrenamiento. Nosotros no hemos abandonado totalmente lenguajes como Java y C++. (Aunque hay veces en los que desearíamos hacerlo).

Sin embargo, Ruby es probablemente más aplicable de lo podrías pensar. Es fácil de extender, tanto en el propio lenguaje como enlazándolo con librerías de terceras partes. Es portable a lo largo de bastantes plataformas. Es relativamente ligero y consume pocos recursos del sistema. Y es fácil de aprender; conocemos gente que ha puesto código Ruby en producción con un día de revisar borradores de este libro. Nosotros hemos utilizado Ruby para implementar partes de un gestor de ventanas X11, una tarea que normalmente se considera apropiado para el lenguaje C. Ruby sobresalió y nos ayudó a escribir código en horas que en otro caso nos hubiese llevado días.

Una vez que estés cómodo con Ruby, creemos que volverás a el como tu lenguaje favorito.

¿Por qué escribimos este libro?

Así que una vez finalizamos de escribir El Programador Pragmático, nuestra familia comenzó a hablarnos de nuevo, y de pronto sentimos la necesidad de escribir otro libro. ¿Por qué? Imaginamos que por algún tipo de fervor misionero.

Ruby fue creado por Yukihiro Matsumoto (Matz) en Japón. Desde 1995, su popularidad en Japón ha crecido en asombrosa proporción; hay rumores de que Ruby es en Japón más popular que Python. Pero hasta la fecha, mucha de la documentación está en Japonés. No es probablemente un lenguaje de programación con el que te tropezarías.

Nosotros queremos difundir el rumor, tener más gente fuera de Japón utilizando Ruby y disfrutando los beneficios, así que decidimos documentar Ruby en Inglés. Y comenzamos un pequeño proyecto que creció...

Versiones de Ruby

Este libro documenta la Versión 1.6 de Ruby, que fue liberado en Septiembre del 2000.

La numeración de versiones de Ruby sigue el mismo esquema utilizado por muchos otros proyectos Open Source. Las versiones con un nº de subversión par (1.0, 1.2, 1.4, y así) son versiones públicas y estables. Hay versiones que están preempaquetadas y están disponibles en varias páginas web dedicadas a Ruby.

Las versiones de desarrollo del software tienen nº de subversión impar, como 1.1 y 1.3. Estás tendrás que descargarlas por ti mismo, como se describe en el recuadro de la página xxvii.

Instalando Ruby

Puedes encontrar Ruby en ftp.//ftp.netlab.co.jp/pub/lang/ruby, o desde la lista de mirrors de la página 526 en el Apéndice C. Ahí encontrarás la última versión estable, así como varias versiones de desarrollo.

Siempre encontrarás el código fuente de las versiones de Ruby; también podrás encontrar binarios para Windows y otros sistemas operativos (como la distribución binaria de Ruby para Windows en http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html).

Sidebar: El último Ruby

Para aquellos que tienen que estar en la última, recién salida de la imprenta y sin testear (como mientras estábamos escribiendo este libro), puedes obtener versiones de desarrollo directamente desde el del repositorio de trabajo de los desarrolladores.

Los desarrolladores de Ruby utilizan CVS (Concurrent Version System, disponible de forma libre desde http://www.cvshome.com) como su sistema de control de versiones. Puedes comprobar los ficheros como un usuario anónimo desde sus archivos ejecutando el siguiente comando CVS:

% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   login
(Logging in to anonymous@cvs.netlab.co.jp)
CVS password: guest
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
   checkout ruby

El árbol completo del código fuente, tal y como lo dejaron los desarrolladores, será copiado a un subdirectorio ``ruby'' de tu máquina, actualizando tu árbol local desde un repositorio en el otro extremo del mundo. ¿No son buenos tiempos para vivir?

Construyendo Ruby

En la distribución de Ruby encontrarás un fichero llamado README, el cual explica el procedimiento de instalación en detalle. Para resumir, construyes Ruby en sistemas basados en POXIS utilizando los mismos cuatro comandos que utilizas para la mayoría de las otras aplicaciones open source: ./configure, make, make test, and make install. Puedes construir Ruby bajo otros entornos (incluyendo Windows) mediante el uso de un entorno de emulación POXIS como cygwin [Ver http://sourceware.cygnus.com/cygwin para más detalles.] o utilizando compiladores nativos ---ver ``ntsetup.bat'' en el directorio win32 de la distribución como punto de comienzo.

Ejecutando Ruby

Ahora que Ruby está instalado, probablemente quieras ejecutar algunos programas. Al contrario que en entornos compilados, hay dos modos de ejecutar Ruby --- de modo interactivo y como un programa.

Ruby Interactivo

El modo más simple para ejecutar Ruby interactivamente es tecleando ``ruby'' en el interprete de comandos.

% ruby
puts "Hello, world!"
^D
Hello, world!

Aquí hemos tecleado la expresión puts y un carácter fin de fichero (que es control-D en nuestro sistema). Este proceso funciona, pero es algo doloroso si cometes un error mecanográfico, y no puedes ver realmente que está pasando

En el directorio sample de la distribución Ruby encontrarás un script llamado ``eval.rb''. Va un paso más allá, mostrándonos el valor de cada expresión a medida que se introducen:

% cd sample
% ruby eval.rb
ruby> a = "Hello, world!"
"Hello, world!"
ruby> puts a
Hello, world!
nil
ruby> ^D
%

Aquí podemos ver la salida de puts, y el valor devuelto por puts (que es nil).

Hasta aquí todo correcto, excepto que las expresiones multilíneas no funcionan, y que no puedes editar la línea en la que estás, o ir atrás y utilizar líneas previas (como podrías con el histórico de comandos de un interprete de comandos).

El siguiente paso desde eval.rb, tenemos irb ---Interactive Ruby. irb es un Interprete de Comandos Ruby, completado con histórico de comandos, capacidad de edición de líneas, y control de trabajo. Es bastante configurable y tiene muchas opciones, tanto que tiene su propio apéndice que comienza en la página 517. Nosotros te recomendamos que te familiarices con irb para poder probar algunos de nuestros ejemplos interactivamente.

Programas en Ruby

Finalmente, tu puedes ejecutar un programa Ruby desde un fichero como harías con otro shell script, programa en Perl o Python. Sencillamente, puedes ejecutar Ruby dando el nombre del script como argumento:

% ruby myprog.rb

O puedes utilizar la notación UNIX ``shebang'' como la primera línea del fichero del programa. [Si tu sistema lo soporte, puedes evitar especificar la ruta a Ruby en la linea shebang utilizando #!/usr/bin/env ruby, que encontrará tu ruta a ruby y lo ejecutará.]

#!/usr/local/bin/ruby -w

puts "Hello, World!"

Si haces este fichero de código ejecutable (utilizando, por ejemplo, chmod +x myprog.rb), Unix te permite ejecutar el fichero como un programa:

% ./myprog.rb
Hello, World!

Puedes hacer algo similar bajo Windows utilizando la asociación de ficheros.

Recursos

Visita las web, http://www.rubycentral.com y http://www.ruby-lang.org, para ver qué hay de nuevo, y conversar con otros usuarios de Ruby en los grupos de noticias o listas de correo (ver Apendice C).

Nosotros ciertamente apreciamos oírte. Comentarios, sugerencias, errores en el texto, y problemas en los ejemplos son bienvenidos. Enviamos un correo a:

mailto:rubybook@pragmaticprogrammer.com

Si nos dices algo sobre errores en el libro, lo añadiremos a la lista de errores en:

http://www.pragmaticprogrammer.com/ruby/errata/errata.html

Finalmente, http://www.pragmaticprogrammer.com/ruby también contiene el código fuente de la mayoría de los ejemplos del libro, organizados por página.

Agradecimientos

Este libro es un gran cometido, que no habría sido posible completar sin la ayuda de todos nuestros amigos, viejos y nuevos. Estamos contentos de contar entre nuestros viejos amigos al equipo de Addison-Wesley: Mike Hendrickson, John Fuller, la siempre útil Julie Steele, y la maravillosa Julie DiNicola. Gracias a todos.

Nuestros revisores fueron fantásticos. Les pusimos contra algunas increibles fechas topes y ellos salieron con vida. Revisar un libro lleno de detalles técnicos no es fácil, así que estamos especialmente agradecidos a George Coe, Bob Davison, Jeff Deifik, Hal Fulton, Tadayoshi Funaba, Clemens Hintze, Kazuhiro Hiwada, Kikutani Makoto, Mike Linksvayer, Aleksi Niemelä, Lew Perin, Jared Richardson, Armin Roehrl, Conrad Schneiker, Patrick Schoenbach, and Eric Vought. Las gracias van también a las dos Julies de Addison-Wesley por coordinar este autentico esfuerzo internacional.

Mucha gente nos ayudó en áreas especificas de este libro. Tadayoshi Funaba intercambió incontables correos con nosotros hasta que finalmente entendimos el módulo Date. Guy Decoux y Clemens Hintze respondieron pacientemente a nuestras preguntas sobre escribir extensiones de Ruby, y Masaki Suketa nos ayudó a entender el módulo WinOle.

Aunque mucha de la documentación original de Ruby está en Japonés, hay un grupo creciente de traducciones al inglés, mayormente acometidas por desarrolladores japoneses cuyas capacidades con el inglés no paran de sorprendernos. Aunque hay demasiadas contribuciones individuales en este esfuerzo como para nombrar cada autor, querríamos destacar a Goto Kentaro, quien ha producido un gran volumen de documentación de mucha calidad y la ha puesto online.

Finalmente, queremos dar las gracias a Yukihiro ``Matz'' Matsumoto, el creador de Ruby. Hemos perdido la cuenta del nº de preguntas que le hemos hecho, y el numero de pacientes y detalladas respuestas que nos ha devuelto. Igual que ha creado un maravilloso lenguaje, Matz ha fomentado una cultura maravillosamente comprensiva y abierta en la cual el lenguaje puede prosperar.

Gracias a todos. Domo arigato gozaimasu.

Dave Thomas y Andy Hunt
The PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com

Convenciones de Notación

A lo largo de este libro, usamos las siguientes notaciones de tipografía.

Los ejemplos literales de código son mostrados utilizando una fuente similar a una máquina de escribir.

class SampleCode
  def run
    #...
  end
end

El texto, Fred#doIt es una referencia a un metodo de instancia (doIt) de la clase Fred, mientras Fred.new [ en algunos otras documentaciones de Ruby, podrías ver métodos de clase escritos como Fred::new. Esto es perfectamente válido en sintaxis Ruby; solo ocurre que nos parece que Fred.new es menos molesto de leer.] es un metodo de clase, y Fred::EOF es una constante de clase.

El libro contiene varios trozos de código Ruby. Donde sea posible, intentaremos mostrar que suceden cuando se ejecutan. En casos simples, mostramos el valor de la expresión en la misma línea que la expresión. Por ejemplo:

a = 1
b = 2
a + b » 3

A veces, también estamos interesados en los valores de las sentencias de asignación, en cuyo caso los mostraremos.

a = 1 » 1
b = 2 » 2
a + b » 3

Si el programa produce salidas más complejas, las mostramos debajo del código del programa:

3.times { puts "Hello!" }
produces:
Hello!
Hello!
Hello!

En partes de la documentación de la librería, quisimos mostrar donde aparecen espacios en la salida. Verás estos espacios como ``[visible space]'' caracteres.

Las llamadas en línea de comandos son mostradas con texto literal en una fuente Roman, y los parámetros que proporcionas en una fuente italica. Los elementos opcionales son mostrados en grandes corchetes.

ruby [
            opciones
            ]*
             [
            nombre_programa
            ] [
            argumentos
            ]+
            


Extraído del libro "Programming Ruby - The Pragmatic Programmer's Guide"
Copyright © 2000 Addison Wesley Longman, Inc. liberado bajo los términos de la Open Publication License V1.0.
La referencia está disponible en: download.