Ich kann nicht verstehen, warum der Zugriff auf die Klassenvariable des Moduls im folgenden Beispiel fehlschlägt:
%Vor% Kann irgendjemand erklären, warum die Klassenvariable @@xyz
plötzlich in der Singleton-Klasse von C
nicht mehr zugreifbar / undefiniert ist?
Aktualisierung: Ich habe den obigen Code mit verschiedenen Ruby-YARV-Versionen erneut getestet und finde es als eine Regression im letzten.
Update 2:
Die Definition der Methode Module#class_variables
in der letzten Ruby-Generation wurde geändert.
Ruby bis 1.9.3 Die Definition ist
class_variables → Array
Gibt ein Array der Namen der Klassenvariablen in mod.
zurückRuby 2.0.0 letzte stabile Version
class_variables (inherit = true) → Array
Gibt ein Array der Namen von Klassenvariablen in mod zurück. Dies enthält die Namen der Klassenvariablen in allen enthaltenen Modulen, es sei denn, der Parameter erben ist auf false gesetzt.
In der letzten Inkarnation von Ruby gibt class_variables
standardmäßig auch Klassenvariablen der enthaltenen Module zurück. Nur neugierig, was ist diese Funktion für oder wenn es immer noch betrifft Module "enthalten" mit include
und nicht extend
.
Kann jemand das erklären?
Ich bin mir nicht sicher, ob das eine Antwort ist, aber ich habe diese gefunden
%Vor%und
%Vor%(Dies von Ruby 1.8.7, habe keine neuere Version zur Hand).
include
bewirkt, dass die Instanzmethoden des Moduls Instanzenmethoden der Klasse werden. Nach Pickaxe, "Es ist fast so, als ob das Modul eine Oberklasse der Klasse wird, die es verwendet".
Inzwischen ist extend
beabsichtigt, die Methoden eines Moduls zu einem Objekt hinzuzufügen; Wenn es in einer Klassendefinition aufgerufen wird, entspricht es self.extend
. Es scheint, dass sie nicht gleichwertig sind.
HTH.
Dies ist keine Antwort, nur einige Kommentare zu der Frage.
Wenn wir das Modul M
in die Klasse C
einfügen, wird C
Klassenvariablen in M
:
Das Aufrufen von extend M
in der Klassendefinition ist gleichbedeutend mit dem Aufruf von include M
in der Eigenklasse (oder Singleton-Klasse) dieser Klasse.
Es scheint der Unterschied zu sein, dass Ruby normale Klassen und Eigenklassen anders behandelt.
Kurz gesagt, der Unterschied, den Sie beobachten, ist, dass Module nicht wie Klassen funktionieren. Ich habe diese Frage von mir vor nicht allzu langer Zeit an meine Vorgesetzten gestellt: Klassenmethoden von Mixins geerbt
Und ich folgerte, dass, während Module in einigen Aspekten der Klasse ähneln, Ruby sie in anderen Aspekten einfach als gewöhnliches Objekt behandelt. Insbesondere ist das, was als "Klassenkram" mit Klassen (Klassenmethoden, Klassenvariablen ...) bekannt ist, einfach als "Singletonkram" in anderen Objekten bekannt (Singleton-Methoden usw.). Die Singleton-Klassen von Modulen sind in vielerlei Hinsicht behandelt wie Module waren gewöhnliche Objekte.
Was das spezielle Codebeispiel betrifft, funktioniert es auf meinem Ruby 1.9.3p194 anders:
%Vor%Natürlich würde ich das erwarten. C.singleton_class ist eine direkte Unterklasse der Klasse Class, und nirgends habe ich gesehen, dass Sie irgendwelche Klassenvariablen für die Klasse oder ihre Nachfolger eingerichtet haben ... Aber ich glaube Ihnen, dass der Code so funktioniert, wie Sie auf Ihrem Rechner schreiben.
Tags und Links ruby