Primero que nada, quiero aclarar que el motivo de este artículo no es convencerte de que Ruby es un lenguaje superior a cualquier otro, si no colocar algunas características que podrían interesarte del lenguaje para aprender. Actualmente estamos publicando un curso de Rails 4, y tenemos un curso de Ruby así que si el lenguaje te interesa, podrías seguir alguno de esos cursos.
Ruby es el lenguaje con el que trabajo todos los días, no me considero un experto, pero conozco algunas cosas que me pareció interesante compartir, si algún Ruby expert quiere corregir algo del código que aquí escribo, se lo agradecería :) Si desean agregar cosas, también estaría genial.
Ruby es un lenguaje que se caracteriza por preocuparse más por el desarrollador que por la máquina, esto se traduce en dos cosas:
- La sintaxis es muy amigable y se lee casi como lenguaje natural.
- El performance no es igual que en lenguajes de más bajo nivel.
Esto no quiere decir que Ruby sea un lenguaje de performance pobre, puesto que se utiliza en aplicaciones (sobre todo web) que manejan muchísimas peticiones por segundo (como Basecamp ). Pero sí hay una diferencia entre el tiempo de ejecución de Ruby y otros lenguajes como C++, JAVA y ni qué decir de C.
Ruby es muy popular en aplicaciones web porque existe Ruby on Rails un framework muy popular para hacer aplicaciones web que algún día utilizaron o siguen utilizando sitios como Twitter, Github, Airnbn, SoundCloud, etc. Rails es el framework web más popular en la comunidad Ruby, aunque también existen otros como Sinatra. En Ruby también puedes crear aplicaciones de escritorio, ya que es multi plataforma, además de que puedes escribir aplicaciones móviles para diferentes plataformas con RubyMotion.
Después de una pequeña introducción al lenguaje, hablemos con código sobre Ruby.
Todo es un objeto (casi)
Ruby es un lenguaje orientado a objetos, como JAVA, C++, Python, etc. Con la característica de que Ruby se toma muy en serio su papel sobre ser orientado a objetos. En Ruby, por ejemplo, no hay primitivos, como int, todo es un objeto, incluso los operadores como +
, <
son objetos.
¿Qué no es un objeto en Ruby? Los bloques, aunque pueden serlo (what!), los controles de flujo como if
else
while
y algunos otros, tampoco son objetos, {
y }
tampoco son objetos.
¿Es esto interesante? Personalmente lo es, por ejemplo puedes ejecutar métodos sobre lo que en otros lenguajes serían primitivos, algo así como convertir un número a cadena:
En Ruby
numero = 1
numero.to_s
En JAVA(por ejemplo)
int numero = 1;
Integer.toString(numero);
Puedes sobre escribir el lenguaje.
Esto es interesante, aunque en el mundo real productivo no sé qué tanto se utilice, pero aquí va. Imagina que por alguna extraña razón quieres sobre escribir el método que convierte enteros a cadenas, podrías hacer algo así:
class Fixnum
def to_s
self + 1
end
end
1.to_s # Retorna 2 en lugar de "1"
Y así sobreescribiste un método de una clase del lenguaje para que funcione como tú quieras, en este caso en lugar de convertir a string el valor, le suma un 1 :P
Ojo, esto sólo aplica para la ejecución de tu programa ;) así que no debes temer arruinar tu intérprete
Los símbolos
Esta sección se agregó por recomendación de @IvanChukitow en Twitter, así que pasen a agradecerle por revisar el artículo!
En Ruby tenemos símbolos, se escriben así :nombre_simbolo
y son, cadenas no mutables, es decir que las diferencias con un String son:
- Empiezan con
:
- No pueden cambiar su valor, a diferencia de las cadenas, que sí pueden.
Los símbolos son una característica muy particular de Ruby y no sé si sean utilizados en otros lenguajes como tal. ¿Para qué sirven? En primer lugar se utilizan cuando estás declarando una cadena que no va a cambiar, en segundo lugar tienen un performance mucho mayor que un String normal por... veamos algo de código antes de explicar por qué:
:hola_mundo.object_id == :hola_mundo.object_id #True
"hola mundo".object_id == "hola mundo".object_id # False
Analicemos el código que acabamos de escribir, en primer lugar no estamos comparando las cadenas como tal, por que en ese caso "hola mundo" == "hola_mundo"
es verdadero. Estamos en cambio comparando el ID del objecto, un ID que Ruby utiliza para identificar el objeto en la memoria.
¿Por qué uno da verdadero y el otro falso? Porque cuando Ruby ve 2 símbolos iguales no crea otro objeto, si no referencía al ya creado, mientras que en cadenas, Ruby no sabe si 2 cadenas "dicen lo mismo" así que sigue creando en memoria más objetos por cadena que creamos.
Esto se traduce en mejor performance del lenguaje, básicamente ejecuciones con cadenas son más lentas que con símbolos. Algo muy cool y muy visto en código de Ruby :)
Los bloques <3
En Ruby el manejo de bloques de código es muy interesante, los métodos que escribes pueden recibir un bloque de código, y a partir de ahí hacer algunas cosas interesantes. Antes de pasar a esto de recibir bloques en un método, quisiera poner un ejemplo de un bloque:
5.times do |val|
puts val
end
El bloque en el ejemplo anterior empieza con do
y termina con end
, los bloques también pueden delimitarse con llaves {
}
aunque hacemos esto generalmente cuando el bloque es de una sola línea:
5.times { |val| puts val }
Una vez dicho esto, qué tiene todo esto de interesante, lo interesante es que los métodos de tus objetos pueden recibir bloques, tipo:
def cool_method
yield
end
cool_method do
puts "Hola mundo"
end
Ejecutar el anterior script resultará en una impresión en pantalla "Hola mundo"
. Y lo que pasó es que cuando en Ruby se encuentra el keyword yield
se ejecuta el bloque de código que se le envió al método, en este caso la impresión en pantalla de "Hola mundo". ¿Qué tal? Esto tiene N casos en los que te puede ser útil, infinidad.
Lo anterior fue sólo un ejemplo, pero hay muchísimas cosas interesantes más, puedes pasar parámetros al bloque, puedes validar si tu método recibió un bloque con block_given?
y etc etc etc, recuerda que el artículo es para mencionar las características del lenguaje, para luego aprenderlas :)
Metaprogramming
Sé que muchos lenguajes tienen esta característica, Ruby es uno de ellos, y bueno, es algo muy interesante. Podemos definir la meta programación (en español) como la habilidad de un lenguaje de modificar un programa en tiempo de ejecución, por ejemplo, auto generando código. Una definición mucho más vaga es decir que con un lenguaje que soporta metaprogramming podemos escribir código que genere código. Por ejemplo:
[ "user" , "editor" , "admin" ].each_with_index do |user_level,index|
define_method("is_#{user_level}?") do
return true if user.permission_level == index
end
end
El snippet de código anterior define los métods is_user?
, is_editor?
, is_admin?
sin que los escribamos cómo tal, el método define_method
hace precisamente eso, definir un método, por eso decimos que es código que genera código.
Esta parte del lenguaje generalmente viene una vez que has aprendido muchas otras cosas de Ruby, y claro, para nada se limita al ejemplo que di anteriormente, eso sólo es una parte :)
Conclusión
Este es un artículo con 4 características interesantes de un lenguaje que fue diseñado para *Hacer felices a los programadores, en serio.
La última característica que quiero mencionar, es que lo mejor de Ruby es la comunidad, es una comunidad grande, dispuesta a ayudar en donde pensamos que Matz es bueno, nosotros también ("Matz is nice so we are nice") (Matz es el creador de Ruby). ¿Qué significa que la comunidad sea grande y buena? Que hay muchísimos proyectos Open Source muy buenos (como Rails), que hay muchísimos foros con soluciones a muchísimas dudas y que hay muchísimos recursos para aprender a usar Ruby.
Si te interesó el lenguaje te invito a seguir el curso de Ruby de Código Facilito o si no tienes problemas con el inglés, que sigas los ejercicios de RubyMonk donde puedes aprender desde lo más básico hasta meta programación, manejo avanzado de bloques y cosas así con ejercicios en el navegador :) También puedes probar Ruby en TryRuby donde aprendes lo básico del lenguaje en tu navegador.
En fin, pueden dejar sus sugerencias, dudas y aclaraciones en la sección de comentarios, espero que les haya gustado el post :D