Ich versuche besser zu verstehen, wie Module sich gegenseitig erweitern und einschließen.
Sagen wir, ich habe Modul A :
%Vor%Ich mische seine Trickkiste in B :
%Vor%Ich versuche naiv, C alles zu geben B hat:
%Vor%Ich denke, ich habe meinen Kopf darum gewickelt. Wenn B A erweitert wird, werden Kopien der Instanzmethoden von A über die Singleton-Klasse von B an B gebunden:
%Vor%Obwohl : erlernte_von_A auf B aufgerufen werden kann, ist dies keine Methode B -Instanz Wenn C B erweitert, wird : gelernte_from_A nicht in C kopiert. p>
Wenn B stattdessen enthalten A enthielt, wären Kopien der Instanzmethoden von A in die eigenen Instanzmethoden von B eingefügt worden.
> %Vor%Dann könnte C B erweitern, und alle Instanzmethoden von B (einschließlich : gelernte_von_A ) werden kopiert und an C .
%Vor%Um : erlernte_von_A auf beiden Seiten B und C , B , aufrufbar zu machen könnte und um A erweitern.
%Vor%Realistischer ausgedrückt, wenn die Methoden von A auf B aufrufbar sein sollen und B eine andere eigene Methode definieren soll , und können das ganze Repertoire in C mischen, das kann ich nicht:
%Vor%B kann nur seine Instanzmethoden und nicht seine Singleton-Methoden teilen. Um also eine Methode sowohl auf B als auch auf andere Objekte aufrufbar zu machen, muss sie als Instanzmethode definiert und auf B selbst erweitert werden:
%Vor%Es gab eine Menge Versuch und Irrtum, alles zusammen zu setzen. Ist es eine genaue Art zu sehen, was vor sich geht?
Ich mische seine Trickkiste in B
Dieser Satz und Ihre Frage im Allgemeinen haben mich glauben lassen, dass es ein kleines Missverständnis im Konzept von include
/ extend
ding gibt. Ich entschuldige mich im Voraus, weil ich die Frage nicht vollständig verstehe.
Zum Beispiel haben Sie ein solches Modul:
%Vor%Wie Sie sehen, gibt es zwei Arten von Methoden:
Hier ist der einfachste Weg zu zeigen, dass sie sich tatsächlich unterscheiden:
%Vor% Wenn Sie include A
vereinfachend verwenden, fügen Sie die Methoden instance den Methoden des aktuellen Moduls instance hinzu. Wenn Sie extend A
vereinfacht ausführen, fügen Sie die Methoden instance zu den aktuellen Methoden des Moduls singleton hinzu.
Noch etwas zu sagen ist, dass Sie extend self
aber nicht include self
haben könnten, da dies keinen Sinn ergibt und auch eine Ausnahme auslöst.
Ich denke, diese Dinge könnten dir helfen. Es gibt viele Fragen zu extend
/ include
auf StackOverflow, die Sie überprüfen können ( Beispiel ).