
Para comprender la metaprogramación en ruby es muy importante saber que se mueve entre los hilos, por lo que hay que comprender muy bien la jerarquía de clases. No voy a dar una descripción muy en profundidad, ya que para eso hay otras referencias muy buenas (1, 2, 3), sino que aportaré una descripción general de qué hay por ahí.
Cuando creamos una clase de manera “normal”, automáticamente se añade a la cadena de clases existente:
class Demo; end => nil Demo.ancestors => [Demo, Object, Kernel, BasicObject]
Como podemos ver, nuestra clase Demo se crea como subclase de Object, que a su vez mama de Kernel, que a su vez hereda de BasicObject, que es el padre de todo bicho viviente en rubí.
BasicObject contiene la definición más básica de una clase, para poder efectuar técnicas que veremos más adelante (Blank Slate, por ejemplo).
Kernel es un módulo que contiene gran cantidad de métodos muy utilizados, como por ejemplo print. Se podría pensar que es una palabra reservada de ruby, pero son métodos accesibles a todas las clases.
Kernel.methods.grep(/print/) => [:sprintf, :printf, :print]
Object es la clase de donde heredan todas las clases generadas por el usuario. Contiene un montón de métodos que nos permiten trabajar con clases y objetos.
Hay que aclarar que una cosa es la clase de la que heredan todas las clases nuevas (Objects) y otra es la clase de la clase generada (Class). En el fondo una clase no es más que un objeto de la clase Class:
Demo.superclass => Object Demo.class => Class
Cuando instancias una clase, el objeto pasa a tener como clase la clase instanciada, valga la redundancia.
obj = Demo.new => #<demo:0x000001008774a8> obj.class => Demo
loading...






[...] rápido. En relación a lo que comentábamos en un post anterior sobre la jerarquía de clases, existe un truquillo muy utilizado para añadir un método a todos los objetos del sistema, y es [...]