Ich habe versucht, Matz und Flanagans „Ruby-Programmiersprache“ metaprogramming Kapitel in meinen Kopf zu bekommen, aber ich konnte die Ausgabe aus dem folgenden Code-Snippet, das ich geträumt nicht verstehen:Wie bekomme ich Konstanten von Rubys Modul-Klasse über Reflektion definiert?
p Module.constants.length # => 88
$snapshot1 = Module.constants
class A
NAME=:abc
$snapshot2 = Module.constants
p $snapshot2.length # => 90
p $snapshot2 - $snapshot1 # => ["A", "NAME"]
end
p Module.constants.length # => 89
p Module.constants - $snapshot1 # => ["A"]
p A.constants # => ["NAME"]
Das Buch besagt, dass Die Klassenmethode constants
gibt die Liste der Konstanten für die Klasse zurück (wie Sie in der Ausgabe für A.constants
sehen können). Ich habe versucht, die Liste der Konstanten zu erhalten, die für die Modul-Klasse definiert sind, als ich auf das obige merkwürdige Verhalten stieß.
A
Konstanten werden in Module.constants angezeigt. Wie bekomme ich die Liste der Konstanten, die von der Module-Klasse definiert sind?
Die docs Zustand
Module.constants
kehrt alle Konstanten in dem System definiert. einschließlich der Namen aller Klassen und Methoden
Seit A
erbt seine Implementierung von Module.constants
, wie es anders in der Basis und abgeleitete Typen verhält?
p A.class # => Class
p A.class.ancestors # => [Class, Module, Object, Kernel]
Hinweis: Wenn Sie Ruby 1.9 verwenden sind, constants
würde eine Reihe von Symbolen anstelle von Strings zurück.
Habe ich Ihre Frage beantwortet? Ich frage, weil meine Antwort nicht "akzeptiert" wurde, aber keine zusätzlichen Informationen verlangte ... –
@Marc - Ihre Antwort führte mich zu mehr Fragen und mehr Kritzeln und Löschen. Ich habe diese Woche damit verbracht, meinen Kopf über die Methode der Methodenauflösung zu legen ... Ich bin immer noch nicht klar, was die Möglichkeiten sind - aber ich denke, ich bin mir zu 90% sicher, wie es funktioniert. Siehe meinen Beitrag unten. – Gishu