Une des choses intéressantes à propos de ruby est que vous pouvez appeler des méthodes et exécuter du code dans des endroits où d'autres langages seraient désapprouvés, comme dans les définitions de méthode ou de classe.
Par exemple, pour créer une classe qui a une superclasse inconnue jusqu'à l'exécution, c'est-à-dire qu'elle est aléatoire, vous pouvez faire ce qui suit:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Cela utilise la Array#sample
méthode 1.9 (en 1.8.7 uniquement, voir Array#choice
), et l'exemple est assez artificiel mais vous pouvez voir la puissance ici.
Un autre exemple intéressant est la possibilité de mettre des valeurs de paramètres par défaut qui ne sont pas fixes (comme le demandent souvent d'autres langues):
def do_something_at(something, at = Time.now)
# ...
end
Bien sûr, le problème avec le premier exemple est qu'il est évalué au moment de la définition, pas au moment de l'appel. Ainsi, une fois qu'une superclasse a été choisie, elle reste cette superclasse pour le reste du programme.
Cependant, dans le deuxième exemple, chaque fois que vous appelez do_something_at
, la at
variable sera l'heure à laquelle la méthode a été appelée (enfin, très très proche de celle-ci)