Il metodo per ottenere il nome di una classe (modulo, in realtà) è solo Module#name
. Non c'è alcuna necessità di scrivere il proprio:
Parent.name # => 'Parent'
Child.name # => 'Child'
Tuttavia, in Ruby, non c'è davvero una cosa come un "nome di classe" in quanto v'è in alcune altre lingue. In Ruby, una classe è semplicemente un oggetto come qualsiasi altro oggetto che viene assegnato a una variabile come qualsiasi altra variabile.
Tutto il metodo Module#name
esegue il ciclo di tutte le costanti nel sistema e controlla se il modulo è stato assegnato a uno di essi e restituisce il nome di tale costante o nil
se non ne trova alcuno.
Quindi, proprio come qualsiasi altro oggetto, il "nome" di una classe è veramente, ma non importa quale variabile si usa per riferirsi ad esso.
Esempio:
foo = Class.new
foo.name # => nil
Ora, il "nome" della classe è foo
. Tuttavia, Module#name
restituisce nil
, perché foo
non è una costante.
bar = foo
bar.name # => nil
Ora, il "nome" della classe è siafoo
e bar
, ma Module#name
ovviamente restituisce comunque nil
.
BAZ = foo
foo.name # => 'BAZ'
Ora, dal momento che la classe è stato assegnato a una costante, il nome di quel costante sarà considerato nome & hellip di quella classe;
BAZ = nil
foo.name # => 'BAZ'
& hellip; anche dopo che la costante è stata assegnata a qualcosa di diverso e & hellip;
QUX = foo
QUX.name # => 'BAZ'
& hellip; anche dopo che la classe è stata assegnata a una costante diversa.
Module#to_s
usa Module#name
se non è nil
, così, per stampare il nome di una classe, è sufficiente fare
puts Parent
Non c'è davvero alcun bisogno di tutto il complesso fluff nelle altre risposte.
Sembrava troppo semplice. Grazie. –
Cosa c'è di sbagliato in ['Module # name'] (http://Ruby-Doc.Org/ruby-1.9/classes/Module.html#M000913) e perché il doppio' puts'? –
Non c'è alcun motivo per avere un metodo che ritorni da sé, utilizzare direttamente l'oggetto: 'puts Parent'. Puts chiama Parent.to_s dietro le quinte per ottenere un nome di stringa della classe. –