Apuntes sobre Ruby

Primeras notas que he tomado aprendiendo Ruby con el fantástico libro Programming Ruby.

Ejecutando código ruby.

Podemos escribir código interactivamente desde la consola de comandos o escribirlo en un fichero y luego ejecutarlo (programa), que es lo más apropiado para código complejo o que queramos guardar.

  • Interactivamente:
    • En la consola escribir ruby -> expresión -> ^D (control+D).
      % ruby
      puts "Hello, world!"
      ^D

      Hello, world!

      Apropiado para ejecutar expresiones sencillas.

    • En la consola escribir irb -> expresiones

      % irb
      irb(main):001:0> def sum(n1, n2)
      irb(main):002:1> n1 + n2
      irb(main):003:1> end
      => nil
      irb(main):004:0> sum(3, 4)
      => 7
      irb(main):005:0> sum("cat", "dog")
      => "catdog"

      Irb (interactive ruby) contiene algunas características avanzadas para trabajar interactivamente, por ej va mostrando los resultados de los comandos. Para salir poner exit
  • Programas:
    Suelen tener la extensión .rb. En la primera linea se le puede poner la ruta a Ruby y así los sistemas *nix lo pueden ejecutar directamente (acordarse de hacer el fichero ejecutable). Es en la manera que yo suelo trabajar, aunque sólo sea para hacer pruebas.

    Documentación:

    Tiene un sistema llamado RDoc. Puede ser exportado a HTML facilmente. http://www.ruby-doc.org contiene toda la documentación Rdoc de Ruby. Para acceder a ésta documentación interactivamente se usa el comando ri ClassNameOrMethod

    Nociones básicas de Ruby

    En Ruby todo es un objeto:

    Escribir por pantalla:
    En lineas diferentes:

    one
    thwo

    En la misma linea:

    onethwo
    Con formato:

    Number: 1.23
    String: hello

    Leer por pantalla:

    Variables y constantes

    Convención para distinguir el uso de las variables:

    • Local variables, method parameters, and method names:
      mi_variable
      _mi_variable
    • Global variables:
      $mi_variable
    • Instance variables:
      @mi_variable
    • Class variables:
      @@mi_variable
    • Class names, module names:
      MyClassOrModule
    • Constants:
      CONSTANT_PI

    Acceso:

    Para acceder a una variable o metodo dentro de una clase: clase.var_o_met
    Para acceder a una constante dentro de una clase: clase::CONSTANTE

    Con dobles comillas busca substituciones:

    And good night,
    Grandma

    ‘Good night, ‘ + name es lo mismo que “Good night, #{name}”
    Si es variable global, de instancia, o de clase no hacen falta los corchetes:

    Tambien podemos meter código:

    Las variables contienen referencias a objetos, no objetos:

    Si queremos evitar estos alias:

    Para evitar modificaciones a un objeto:

    comprobar si una variable está definida:

    Símbolos
    Los símbolos son una manera interna de Ruby de manejar strings, también accesible al programador. Se definen con dos puntos delante:
    :a
    :book
    :”Here’s how to make a symbol with spaces in it.”

    Consumen menos recursos que un string, pero son inmutables (no podemos añadir, borrar o modificarlos).

    Cuando creamos una variable x, Ruby automáticamente crea el símbolo :x

    Son apropiados como argumentos para métodos y especialmente como hash keys. También si vamos a utilizar una palabra muchas veces en el código sin ser modificada mejor que sea un símbolo.

    Arrays:

    One\tThwo
    wilma
    great gazoo

    One Thwo
    wilma
    great gazoo

    Hashes:

    Estructuras de control:

    if:

    case:

    while / begin:

    loop:

    1
    2
    3
    4

    for/Do:

    Alteradores de flujo:
    retry: vuelve a empezar desde el primer elemento de la condición
    redo: vuelve a empezar desde el elemento que estaba
    next: salta al siguiente elemento
    break: cancela la iteración

    Bloques:
    Son trozos de código que pueden ser definidos entre do y end o entre llaves.

    Se puede utilizar para hacer callbacks, pasar trozos de código, o implementar iteraciones.

    hola
    hola
    hola
    hola
    hola

    Ejemplos de bloques:

    Muchos de los métodos de las librerías de Ruby que devuelven sucesivos elementos (iteradores) utilizan estos bloques. Ej:

    cat dog horse *****3456abcde

    collect crea un array a partir de otro:

    inject acumula valores a traves de los elementos de un array

    Procs

    Son una manera de guardar trozos de código (blocks) en variables, o pasarlas a métodos.

    Cheers!
    Cheers!
    Cheers!

    Los blocks, como ya hemos visto, pueden recibir variables

    I *really* like chocolate!
    I *really* like Ruby!

    De ésta manera podemos hacer cosas que los métodos no nos permiten, como escribir una función que haga ‘algo’ dos veces, sin saber de antemano qué es ese ‘algo’.

    <wink>
    <wink>
    <glance>
    <glance>

    Podemos enviar acciones y bloques como parámetros a las funciones. Se indica poniendo un & a la variable (las convierte automáticamente a procs).

    acciones:

    bloques:

    Yum! I just love apple pies, don ' t you?
    Yum! I just love cherry pies, don ' t you?
    1 is NOT an even number!
    3 is NOT an even number!
    5 is NOT an even number!

    Podemos hacer de varias formas:

    Expresiones Regulares:

    Metodos:

    Si no se indica un return devuelve el valor de la última sentencia:

    Convención: en minusculas y palabras separadas por _. Normalmente si un método actua como una pregunta se le suele poner un ? (is_instance_of?). Si puede ser peligrosa o modifica al que la llama se le pone un ! (collect!). Si puede asignar un valor se le pone un = (duration=)

    En el caso de querer pasar parametros entre funciones sin saber cuales son esos parámetros, basta con poner un * a la variable.

    Aliasing

    Define un nuevo nombre para referirse a un metodo, operador, variable o expresión regular. Si luego el original cambia el aliased conserva el original.

    Clases

    Métodos de clase

    Un método no tiene poque ir siempre asociado a un objeto, puede ir asociado a la clase en sí. Por ejemplo el método new (se llama para crear una nueva instancia, por lo cual la instancia no puede existir). Otro ejemplo: para crear nuevas canciones, podemos detectar si existe el hardware necesario, de otra manera no tendría sentido crear el nuevo objeto:

    Lectura y escritura de atributos:

    Herencia

    Control de acceso

    Métodos Públicos: Puede ser llamado por cualquiera. Es el acceso por defecto, escepto initialize que es siempre privado.

    Métodos Privados: Sólo pueden ser llamados por la propia clase o subclase, y quien recibe su valor es siempre self (la instancia que llama al método).

    Métodos Protegidos: Sólo pueden ser llamados por la propia clase o subclase, pero su valor puede ser recivido por otro que no sea self, como otras instancias de la clase.

    Errores y escepciones

    Éste sería el código original.

    Para manejar escepciones y errores meteremos el código en una clausula begin, y manejaremos el error con la clausula rescue. Rescue puede manejar distintos tipos de errores, pertenecientes a la clase Esception. En éste caso nos interesa error de sistema. Cuando un error ocurre, rescue guarda en la variable global $! una referencia a ese error. Al terminar llamamos a raise para lanzar la escepción (detiene la ejecución).

    Otras formas de utilizar raise:

    Podemos manejar distintos tipos de errores y guardar sus referencias en variables de ésta forma:

    Si no se encuentran errores podemos realizar alguna acción con else. Con ensure realizamos acciones hubiera o no errores.

    En el manejo de escepción modemos realizar algun cambio y volver a intertarlo con retry.

    Otro tipo de bloque es catch, que es ejecutado hasta que encuentra un trow, que puede estar o no dentro del catch.

    Organizando código. Archivos externos y modules

    Son una manera de agrupar métodos, clases y constantes, sin tener que formar otra clase. Su nombre sigue la misma convención que para las clases.

    Una forma sería guardar esas cosas en varios .rb, pero no funcionaría si tienen funciones con el mismo nombre. Los ficheros externos se cargan con load o require (sólo lo carga una vez).

    trig.rb

    moral.rb

    cargando.rb

    También podemos cargar módulos con include.

    Para acceder a clases anidadas y modulos se usa el operador ::

    Puedes agregar un modulo a un objeto con extend:

    hee, hee!
    Grouchy

    Trabajando con archivos

    Una buena forma de abrir archivos por medio de File.open que soporta bloques, de ésta manera el archivo se cierra automáticamente. El primer parámetro es el nombre del fichero y el segundo el modo de abrirlo, los más importantes son r (lectura), w (escritura), r+ (lectura-escritura), a (agregar).

    Lectura:

    Escritura

    Agregar
    Si no utilizamos bloques tendremos que cerrar el archivo manualmente:

    Lectura escritura con YAML

    Lo visto hasta ahora está bien para guardar cadenas sencillas, pero para guardar datos más complejos como arrays lo más ágil y versátil es utilizar YAML, que es una forma de representar datos, igual que XML, pero mucho más sencillo.

    Otra documentación

    Try Ruby: Explorarás online las características básicas de Ruby.
    Poignant Guide: Buena guía, pero quizá distrae con tanto chiste y parafernalia.

    Una lista muy buena de documentación disponible online está en la web de Ruby.

8 Comments

  • Excelente resumen!

    Saludos,
    Rodrigo

    | Monday, 16 July 2007
  • Muy buena introducción al lenguaje Ruby, lo que no he logrado realizar es estando dentro del interprete irb poder introducir el operador de conincidencia positiva =~ ya que desde la consola windows sin acceder al irb pulsando Alt+126 aparece el símbolo ~ pero cuando estoy dentro del irb no lo puedo lograr me aparecen las letras abc, me gustaría saber como puedo escribir dicho carácter desde el irb.

    Solo utilizo Windows, no controlo Linux.

    Muchas gracias por la aportación…

    By osnola
    | Sunday, 12 August 2007
  • Pues la verdad es que yo tampoco lo he logrado. Quizá debas preguntarle a algún rubyero windowsero, aunque yo te recomendaría un mac jeje

    | Monday, 20 August 2007
  • Buen resumen, en un momento se repasa lo fundamental de Ruby. Ya que va a llegar bastante gente a esta entrada por los buscadores, deberías corregir algunas faltas de ortografía: “comprovar” -> “comprobar” y “recive” -> recibe.

    En el apartado de “trabajo con archivos” tengo una duda. ¿Por qué los ejemplos de lectura y escritura usan bloques y el de “agregar” no? queda un poco raro.

    | Tuesday, 1 January 2008
  • Muchas gracias por tus anotaciones. Corregidas las faltas y añadida una nota indicando que en ese ejemplo no utilizamos bloques.

    | Wednesday, 2 January 2008
  • muy bueno el tuto pero tengo una duda en la parte de de exepciones como puedo rescatar una salida forzosa de un bucle como “loop” que fue hecha con las teclas de ctrl+c ???

    By jose luis
    | Monday, 1 December 2008
  • Pues no sé, pero he encontrado esto, a ver si te vale http://www.ruby-forum.com/topic/49197

    | Monday, 1 December 2008
  • Respecto de usar el ~ yo lo logre cambiando la configuración del teclado desde la consola con [alt][shift izquierdo] es cíclico de modo que siguiendo con las mismas teclas regresa a lo normal.

    By Ampino
    | Tuesday, 3 February 2009

Leave a comment