Überschreibende Methodenaufrufe in Ruby?

7

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.

    
Alex MacCaw 03.02.2010, 16:26
quelle

10 Antworten

12

Verwenden Sie alias oder alias_method :

%Vor%

Ich habe deinen Code mit der class << self -Syntax umgeschrieben, um die Metaklasse zu öffnen, weil ich nicht sicher bin, wie man alias_method für Klassenmethoden sonst verwenden kann.

    
Theo 03.02.2010 16:37
quelle
4

Ä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%     
nightshade427 03.02.2010 19:38
quelle
2

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).

    
Michael Bleigh 03.02.2010 18:33
quelle
1

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.

    
Roman Gonzalez 03.02.2010 19:50
quelle
1

Versuchen Sie, eine Instanzmethode einer Klasse zu haken? Dann könnte das folgende Snippet helfen. Es verwendet RCapture, das über

installiert werden kann %Vor%

Ein einleitender Artikel finden Sie hier

%Vor%     
cheind 04.02.2010 08:21
quelle
0

Dies macht, was Sie wollen, RCapture: Ссылка

    
horseyguy 03.02.2010 17:22
quelle
0

Ich habe keine vollständige Antwort, aber ich denke method_added könnte hier hilfreich sein.

    
Ken 03.02.2010 18:04
quelle
0

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%     
Alex MacCaw 03.02.2010 20:22
quelle
0

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%     
Steve Midgley 25.09.2013 23:48
quelle
0

singleton_method_added kann Ihnen eine einfache Lösung bieten:

%Vor%

Hoffe, das wird helfen.

    
Lan Do 25.11.2016 05:02
quelle

Tags und Links