Sposób, aby uzyskać nazwę klasy (moduł, faktycznie) jest po prostu Module#name
. Nie ma potrzeby, aby napisać swój własny:
Parent.name # => 'Parent'
Child.name # => 'Child'
Jednak w Ruby, naprawdę nie ma czegoś takiego jak „nazwa klasy”, jak jest w innych językach. W Ruby klasa jest po prostu obiektem, jak każdy inny obiekt, który zostanie przypisany do zmiennej jak każda inna zmienna.
Metoda ta polega na przeplataniu wszystkich stałych w systemie i sprawdzeniu, czy moduł został przypisany do którejkolwiek z nich i zwrocie tej stałej nazwy lub nil
, jeśli nie może znaleźć żadnych.
Tak, jak każdy inny obiekt, "nazwa" klasy to naprawdę nic, bez względu na zmienną, której używasz do odniesienia.
Przykład:
foo = Class.new
foo.name # => nil
Teraz "nazwa" klasy jest foo
. Jednak Module#name
zwraca nil
, ponieważ foo
nie jest stałą.
bar = foo
bar.name # => nil
Teraz "nazwa" klasy jest zarównofoo
i bar
, ale Module#name
oczywiście nadal zwraca nil
.
BAZ = foo
foo.name # => 'BAZ'
Teraz, ponieważ klasa została przypisana do stałej, nazwa tej stałej będzie uważana za nazwę klasy & hellip;
BAZ = nil
foo.name # => 'BAZ'
& hellip; nawet po tym, jak stała została przypisana do czegoś innego i & hellip;
QUX = foo
QUX.name # => 'BAZ'
& hellip; nawet po przypisaniu klasy do innej stałej.
Module#to_s
wykorzystuje Module#name
jeśli nie jest nil
, tak, aby wydrukować nazwę klasy, po prostu zrobić
puts Parent
Jest naprawdę absolutnie nie potrzeba całego kompleksu puchu w innych odpowiedzi.
To wydawało się zbyt łatwe. Dzięki. –
Co jest nie tak z ['Module # name'] (http://Ruby-Doc.Org/ruby-1.9/classes/Module.html#M000913) i dlaczego podwójne' puts'? –
Nie ma powodu, aby mieć metodę, która zwraca self, używaj bezpośrednio obiektu: 'puts Parent'. Puts dzwoni do Parent.to_s za kulisami, aby uzyskać nazwę napisu klasy. –