mercredi 2 décembre 2009

Les classes cachées en Ruby

Je terminais un post consacré aux objets et aux classes Ruby par cette question:

Il reste à résoudre le mystère suivant: Où sont stockés les méthodes singletons ?
La réponse sera donné sur un post consacré aux Eigenclasses en ruby.


Une méthode singleton est une méthode qui ne s'applique que sur un objet et non pas à toutes les instances d'une classe.
Il ne faut pas confondre ce système avec le motif (template) singleton de la bande des quatres (GOF). Dans ce cas de design patterns, il s'agit de s'assurer qu'on n'aura toujours qu'une instance de la classe. C'est très utilisé pour ouvrir pour toute une application qu'un seul fichier de log ,ou qu'une connexion à une base de données. Il existe pour cela un gemme Ruby :acts_as_singleton.

Ici je parle des méthodes singleton d'un objet. Il y deux moyens pour créer une méthode singleton:

class Ma_class
def ma_methode
@x1= 1
end;
end;


(clic pour agrandir)

Comment stocker ces deux méthodes ? .
Pas au niveau de l'objet, il ne contient qu'un tableau associatif qui référence des variables d'instances.
Pas au niveau de la classe, si c'était le cas les méthodes ne seraient pas singleton à une instance.

MRI va créer en coulisse une pseudo--classe appelée 'Eigenclass' qui contiendra les méthode singleton d'une instance.
Cela modifie le parcours de recherche d'une méthode (right and up) . Le chemin sera effectuée par l'arborescence des Eigenclasses.

Comment visualiser une Eigenclass ?

En ajoutant cette portion de code :



Ainsi l'appel à la méthode objet1.eigenclass donnera:

objet1.eigenclass.instance_methods(false)
=> ["ma_methode", "singleton1","singleton2"]



Je suis allé au bout du bout du mécanisme de gestion des objets et des classes en Ruby, on peut maintenant continuer sur la meta-programmation.
Ces posts me sont inspirés par la lecture du livre : Metaprogramming Ruby de Paolo Perotta.

Aucun commentaire: