Erweitern Sie den Zugriff auf Module und Klassenvariablen?

9

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ück
  • Ruby 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?

    
David Unric 19.04.2013, 07:23
quelle

4 Antworten

2

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.

    
Mike Woodhouse 19.04.2013 08:02
quelle
1

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 :

definieren %Vor%

Das Aufrufen von extend M in der Klassendefinition ist gleichbedeutend mit dem Aufruf von include M in der Eigenklasse (oder Singleton-Klasse) dieser Klasse.

%Vor%

Es scheint der Unterschied zu sein, dass Ruby normale Klassen und Eigenklassen anders behandelt.

    
Arie Xiao 19.04.2013 08:46
quelle
0

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.

    
Boris Stitnicky 19.04.2013 08:31
quelle
0

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.

    
Boris Stitnicky 19.04.2013 08:48
quelle

Tags und Links