Una de las cosas interesantes de Ruby es que puede llamar a métodos y ejecutar código en lugares donde otros lenguajes estarían mal, como en definiciones de clase o método.
Por ejemplo, para crear una clase que tiene una superclase desconocida hasta el tiempo de ejecución, es decir, es aleatorio, puede hacer lo siguiente:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Esto usa el 1.9 Array#sample
método (solo en 1.8.7, ver Array#choice
), y el ejemplo es bastante ingenioso, pero puedes ver el poder aquí.
Otro buen ejemplo es la capacidad de poner valores de parámetros predeterminados que no son fijos (como suelen exigir otros idiomas):
def do_something_at(something, at = Time.now)
# ...
end
Por supuesto, el problema con el primer ejemplo es que se evalúa en el momento de la definición, no en el momento de la llamada. Entonces, una vez que se ha elegido una superclase, se mantiene esa superclase por el resto del programa.
Sin embargo, en el segundo ejemplo, cada vez que llame do_something_at
, la at
variable será la hora en que se llamó al método (bueno, muy, muy cerca de él)