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!"
^DHello, 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
- En la consola escribir ruby -> expresión -> ^D (control+D).
- 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
thwoEn la misma linea:
onethwo
Con formato:Number: 1.23
String: helloLeer 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::CONSTANTECon 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 gazooOne Thwo
wilma
great gazooHashes:
Estructuras de control:
if:
case:
while / begin:
loop:
1
2
3
4for/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ónBloques:
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
holaEjemplos 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!
GrouchyTrabajando 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.
- Local variables, method parameters, and method names:













8 Comments
Excelente resumen!
Saludos,
Rodrigo
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…
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
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.
Muchas gracias por tus anotaciones. Corregidas las faltas y añadida una nota indicando que en ese ejemplo no utilizamos bloques.
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 ???
Pues no sé, pero he encontrado esto, a ver si te vale http://www.ruby-forum.com/topic/49197
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.