La méthode pour obtenir le nom d'une classe (module, en fait) est juste Module#name
. Il n'y a pas besoin d'écrire votre propre:
Parent.name # => 'Parent'
Child.name # => 'Child'
Cependant, Ruby, il n'y a vraiment pas une telle chose comme un « nom de la classe », comme il y a dans d'autres langues. Dans Ruby, une classe est simplement un objet comme tout autre objet assigné à une variable comme n'importe quelle autre variable.
Toute la méthode Module#name
fait une boucle sur toutes les constantes dans le système et vérifie si le module a été assigné à l'un d'entre eux, et retourne le nom de cette constante ou nil
s'il n'en trouve pas. Ainsi, tout comme n'importe quel autre objet, le "nom" d'une classe est vraiment rien que la variable que vous utilisez pour s'y référer.
Exemple:
foo = Class.new
foo.name # => nil
Maintenant, le "nom" de la classe est foo
. Toutefois, Module#name
renvoie nil
, car foo
n'est pas une constante.
bar = foo
bar.name # => nil
Maintenant, le "nom" de la classe est à la fois foo
et bar
, mais Module#name
évidemment retourne encore nil
.
BAZ = foo
foo.name # => 'BAZ'
Maintenant, puisque la classe a été attribuée à une constante, le nom de cette constante sera considérée comme le nom & hellip de cette classe;
BAZ = nil
foo.name # => 'BAZ'
& hellip; même après que la constante a été assignée à quelque chose de différent et & hellip;
QUX = foo
QUX.name # => 'BAZ'
& hellip; même après que la classe a été affectée à une constante différente.
Module#to_s
utilise Module#name
si ce ne nil
, donc, d'imprimer le nom d'une classe, vous faites simplement
puts Parent
Il n'y a vraiment absolument pas besoin de toutes les peluches complexes dans les autres réponses.
Cela semblait trop facile. Merci. –
Qu'est-ce qui ne va pas avec ['Module # name'] (http://Ruby-Doc.Org/ruby-1.9/classes/Module.html#M000913) et pourquoi le double' puts'? –
Il n'y a pas de raison d'avoir une méthode qui retourne self, utilisez directement l'objet: 'met Parent'. Puts appelle Parent.to_s en coulisse pour obtenir un nom de chaîne de la classe. –