Verfahren den Namen einer Klasse zu erhalten (Modul, tatsächlich) ist nur Module#name
. Es gibt keine Notwendigkeit, Ihre eigenen zu schreiben:
Parent.name # => 'Parent'
Child.name # => 'Child'
, aber in Ruby, es ist wirklich nicht so etwas wie ein „Klassenname“ ist, wie es in einigen anderen Sprachen ist. In Ruby ist eine Klasse einfach ein Objekt wie jedes andere Objekt, das wie jede andere Variable einer Variablen zugewiesen wird.
Alle Module#name
Methode ist Schleife durch alle Konstanten im System und prüfen, ob das Modul zu einer von ihnen zugewiesen wurde, und geben Sie den Namen dieser Konstante oder nil
, wenn es keine finden kann.
Also, genau wie jedes andere Objekt ist der "Name" einer Klasse wirklich nichts als jede Variable, die Sie verwenden, um darauf zu verweisen.
Beispiel:
foo = Class.new
foo.name # => nil
nun der "Name" der Klasse ist foo
. Module#name
gibt jedoch nil
zurück, da foo
keine Konstante ist.
bar = foo
bar.name # => nil
nun der "Name" der Klasse ist sowohlfoo
und bar
, aber Module#name
offenbar noch zurück nil
.
BAZ = foo
foo.name # => 'BAZ'
Nun, da die Klasse zu einer Konstante zugewiesen wurde, die konstant Name wird ist das Klassennamen & hellip betrachtet werden;
BAZ = nil
foo.name # => 'BAZ'
& hellip; selbst nachdem die Konstante etwas anderem zugeteilt wurde und & hellip;
QUX = foo
QUX.name # => 'BAZ'
& hellip; selbst nachdem die Klasse einer anderen Konstante zugewiesen wurde.
Module#to_s
verwendet Module#name
wenn es nicht nil
ist, so, den Namen einer Klasse zu drucken, können Sie einfach tun
puts Parent
Es gibt wirklich absolut keine Notwendigkeit für die ganze komplexe Flusen in den anderen Antworten.
Das schien viel zu einfach. Vielen Dank. –
Was ist los mit ['Module # name'] (http://Ruby-Doc.Org/ruby-1.9/classes/Module.html#M000913) und warum die doppelte' puts'? –
Es gibt keinen Grund, eine Methode zu haben, die self zurückgibt und das Objekt direkt verwendet: 'puts Parent'. Puts ruft Parent.to_s hinter den Kulissen auf, um einen String-Namen der Klasse zu erhalten. –