Ruby: Module, die Module erweitern / einschließen

9

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?

    
ivan 21.11.2015, 21:14
quelle

1 Antwort

3
  

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:

  • singleton_methods
  • instance_methods

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.

%Vor%

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.

%Vor%

Ich denke, diese Dinge könnten dir helfen. Es gibt viele Fragen zu extend / include auf StackOverflow, die Sie überprüfen können ( Beispiel ).

    
Maxim Pontyushenko 29.11.2015, 03:09
quelle

Tags und Links