Kann #initialize in einem Ruby-Modul überschrieben werden?

8

Ich habe versucht herauszufinden, wie man das Verhalten von initialize von einem Modul aus erweitert. Ich möchte es tun, ohne Super in initialize der Klasse zu nennen, in die hineingemischt wird. Ich möchte das normale Muster von include unterstützen Ich kann es nicht herausfinden. Ich habe alles gelesen, was ich zu diesem Thema finden kann, und während die Leute Vorschläge haben, scheint keiner von ihnen zu funktionieren (wenigstens in meinen Händen).

Hier ist was ich (denke) ich weiß:

  • Wenn es überhaupt möglich ist, muss es mit dem Hook on include (d. h. Module.included(base) ).
  • gemacht werden
  • Der include -Hook wird ausgeführt, bevor die einschließende Klasse initialize definiert, so dass es keinen Sinn gibt, einfach initialize mit base.instance_eval zu definieren, weil er überschrieben wird.
  • Es wurde vorgeschlagen, den method_added -Hook zu verwenden und sich damit zu befassen. Das ist, was ich jetzt versuche, aber es scheint, dass der Haken am Anfang der Methodendefinition ausgeführt wird, so dass Sie mit dem enden, was Sie unten sehen.

    %Vor%

Dies ergibt die folgende Ausgabe:

%Vor%

Es sieht so aus, als würde initialize aus der Klasse Foo die Definition noch immer vom Modul überschreiben. Ich nehme an, dass dies daran liegt, dass die Definition noch offen ist, was darauf hindeutet, dass es nicht darum geht, welcher Block zuletzt gestartet wurde, welcher als letzter abgeschlossen ist, der "gewinnt".

Wenn jemand da draußen wirklich weiß, wie man das macht und es funktioniert, bitte erleuchte mich.

FWIW, ja, ich denke, ich habe einen guten Grund, dies zu tun.

    
Huliax 05.07.2013, 22:46
quelle

3 Antworten

24

Wenn Sie Ruby 2.0 oder höher verwenden, können Sie einfach prepend verwenden. Entweder muss der Benutzer prepend anstatt include eingeben oder:

%Vor%     
Chuck 05.07.2013, 23:22
quelle
6

Ok, in Ruby 1.9 könntest du der new -Klassenmethode Funktionalität hinzufügen ...

%Vor%

Das kommt zurück ...

%Vor%     
SteveTurczyn 07.07.2013 03:28
quelle
0

Würde es in Foo's Initialize einen bedingten Aufruf geben, der nur eine eingeschlossene Methode aufruft, wenn sie vorhanden ist?

%Vor%     
SteveTurczyn 05.07.2013 23:08
quelle

Tags und Links