2011-01-04 1 views
0

Je voudrais savoir s'il y a des moyens de vérifier que la classe singleton d'un objet a déjà été créée?La classe singleton d'un objet est-elle déjà créée?

ex: obj.singleton_class_defined?

+0

@egarcia Excellent point. J'adore aider les gens, mais c'est un peu ennuyeux quand quelqu'un demande de l'aide, puis ignore le dur travail que les gens font pour les aider. C'est dur. –

Répondre

3

La classe singleton d'un objet est toujours définie. En 1.8.7, vous pouvez utiliser singleton_methods pour voir si un objet a déjà associé les méthodes singleton:

>> foo = '' 
=> "" 
>> foo.singleton_methods 
=> [] 

1.9.2 (peut-être aussi plus tôt 1,9s, je ne me souviens pas) a aussi une méthode appelée singleton_class, qui vous évite de faire la class << self; self ; end chose que nous tous sommes habitués:

>> foo.singleton_class #=> #<Class:#<String:0x00000100ba5648>> 

Edit:

depuis que vous avez taguée cela avec, je voulais aussi « modèle d'objet » de recommander l'followi lien ng:

http://www.hokstad.com/ruby-object-model.html

Pour citer de là:

Une méta-classe est pour tous les pratiques fins d'une classe réelle. C'est un objet de type Class. La seule chose "spécial" à propos d'une méta-classe est que il est créé au besoin et inséré dans la chaîne d'héritage avant la objets "réel" classe. Donc, à l'intérieur du objet interpréteur MRI-> klass peut se référer à une méta-classe, qui a un pointeur nommé "super" qui se réfère à la prochaine classe dans la chaîne. Lorsque vous appelez object.class en classe MRI, l'interpréteur "saute" réellement sur la méta-classe (et les modules) s'il s'agit de .

+0

Bien sûr, la classe singleton retourne toujours un objet de type Class, et il est inséré dans la chaîne d'héritage avant la classe "real" des objets. Mais je voudrais générer un diagramme des ancêtres d'un objet, si l'objet a utilisé la classe singleton, alors il apparaîtra dans le diagramme, mais ce n'est pas le cas si l'objet n'a pas encore utilisé la classe singleton. – Samnang

+0

Ensuite, vérifiez simplement 'obj.singleton_methods.empty?' :) –

+0

Cette réponse est incorrecte. Une classe singleton n'est pas toujours définie, sauf dans le cas des classes. Dans le cas de T_OBJECTs, la classe singleton est créée paresseusement lorsque la classe singleton est nécessaire. – horseyguy