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ß:
include
(d. h. Module.included(base)
). 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.
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.
Ok, in Ruby 1.9 könntest du der new
-Klassenmethode Funktionalität hinzufügen ...
Das kommt zurück ...
%Vor%Würde es in Foo's Initialize einen bedingten Aufruf geben, der nur eine eingeschlossene Methode aufruft, wenn sie vorhanden ist?
%Vor%Tags und Links ruby