'Colors'
ist nicht der Name der Konstante Colors
, ist es der Name der Module
, die die konstanten Colors
zugewiesen wurde. Es gibt einen fundamentalen Unterschied zwischen Variablen (und ich schließe Konstanten in diesem zusammen mit lokalen Variablen, Instanzvariablen, Klassenvariablen, globalen Variablen, thread-lokalen Pseudo-Globals, method-lokalen Pseudo-Globalen und speziellen Variablen) und Objekte, von denen nicht zuletzt ist, dass Objekte sind, nun, Objekte (duh!) und Variablen sind nicht Objekte! Sie können sie nicht in Variablen speichern, Sie können keine Methoden für sie aufrufen, alles, was Sie tun können, ist ihnen zuzuordnen (zumindest einige davon) und sie zu dereferenzieren. In einer objektorientierten Programmiersprache ist das Methodenaufrufverfahren so gut wie alles, was Sie tun können, und Sie können keine Methoden auf Variablen aufrufen, weil sie keine Objekte sind. Es gibt keine Möglichkeit, Variablenfragen wie " Wie lautet dein Name".
Sie können ein Module
für seinen Namen fragen, weil die Module
Klasse eine name
Instanz Methode, die die Module
der Namen zurückgegeben hat. Integer
hat keine name
Methode, so dass Sie keinen Integer
für seinen Namen fragen können.
Beachten Sie, dass der Name einer Module
ist etwas "magisch".Es ist nil
standardmäßig, aber das erste Mal, dass Sie eine Module
einer Konstante zuweisen, wird der Name einige Darstellung des Pfades zu der Konstante (im Grunde die name
des einschließenden Moduls + ::
+ der Name der Konstante). Wenn Sie das Modul jedoch einer anderen Konstanten zuweisen, bleibt der Name auch dann unverändert, wenn Sie die Konstante remove_const
haben.
Hier ein netter kleiner Code-Snippet ist, dass die Module#name
wirklich gibt den Namen der Module
, nicht der Name der Variablen zeigt, verwendet, um es zu verweisen:
m = Module.new
m.name
# => nil
A = m
m.name
# => 'A'
A = nil
Object.send(:remove_const, :A) # just to be *really* sure
A
# NameError: uninitialized constant A
m.name
# => 'A'
Also, kurz gesagt: nein, es Sie können den Namen einer Konstante (oder einer Variablen) nicht aus dem Objekt abrufen, auf das diese Konstante verweist, auch wenn das Objekt nur durch mehr als eine Variable referenziert werden kann. Und welchen Namen würden Sie dann zurückgeben?
Nein, das ist nicht möglich, weil Sie keine Referenz auf die Konstante haben. Sie haben einen Verweis auf den Wert der Konstante. –