Ich versuche, einen Rückruf zu erhalten, wenn irgendeine Methode für eine bestimmte Klasse aufgerufen wird. Überschreiben "Senden" funktioniert nicht. Es scheint, dass send nicht im normalen Ruby-Methodenaufruf aufgerufen wird. Nehmen Sie das folgende Beispiel.
%Vor%Wenn wir Senden bei Test überschreiben und dann Test.items aufrufen, wird send nicht aufgerufen.
Ist das, was ich versuche, möglich?
Ich würde lieber set_trace_func nicht verwenden, da es die Dinge wahrscheinlich erheblich verlangsamen wird.
Ähnliches: Arbeitet mit Instanzmethoden und Klassenmethoden, es fängt nicht nur die aktuellen Methoden ab, die in der Klasse definiert sind, sondern alle, die später hinzugefügt werden, obwohl die Klasse usw. wieder geöffnet wird.
(es gibt auch rcapture Ссылка ):
%Vor% Sie können sehen, wie dies über die Hook-Funktionalität von ExtLib geschieht. ExtLib :: Hook ermöglicht grundsätzlich das Aufrufen beliebiger Callbacks vor oder nach einer Methode abgeschlossen. Sehen Sie den Code auf GitHub hier für wie es gemacht wird (es überschreibt :method_added
automatisch Methoden umschreiben, wie sie der Klasse hinzugefügt werden).
Sie können so etwas machen, Sie können sogar Bedingungen für die Methode festlegen, die aufgerufen wird oder nicht (ich denke nicht, dass das nützlich ist, aber Sie haben es immer nur für den Fall).
%Vor%Ich hoffe, das funktioniert.
Ich habe keine vollständige Antwort, aber ich denke method_added könnte hier hilfreich sein.
Ich habe es funktioniert mit einer Proxy-Klasse - und dann eine Konstante mit dem richtigen Namen der Klasse festlegen. Ich bin mir nicht sicher, wie ich es mit Instanzen arbeiten kann. Gibt es eine Möglichkeit zu ändern, welche Objektvariablen auch zeigen?
Grundsätzlich möchte ich das tun:
%Vor%Hier ist der Code, den ich benutzt habe, um mit Klassen zu arbeiten:
%Vor%Mein Ansatz wäre, das Objekt, das ich zu protokollieren versuche, mit einem Logger-Shell-Objekt zu umbrechen, das einfach zum ursprünglichen Objekt zurückruft. Der folgende Code umschließt das zu protokollierende Objekt mit einer Klasse, die einfach die gewünschten Methoden für das zugrunde liegende Objekt aufruft, bietet jedoch die Möglichkeit, diese Aufrufe zu protokollieren und (oder was auch immer) jedes Zugriffsereignis zu protokollieren.
%Vor%Ausgabe von diesem Codebeispiel ist:
%Vor%Tags und Links ruby metaprogramming