2017-03-05 8 views
0

Ich versuche herauszufinden, wie Sie mit der TracePoint-API von Ruby die Definition und nachfolgende Neudefinitionen einer bestimmten Klasse (z. B. 'Resolv') auffangen können. Ich bin zu stoppen alle Klassendefinitionen können mit:Ruby TracePoint: Wie definiere ich die Definition einer bestimmten Klasse?

TracePoint.trace(:class) do |tp| 
    require 'pry'; binding.pry # for example 
end 

Aber ich bin nicht in der Lage zu filtern entweder :class oder :end Parameter, so dass ich konnte Falle nur die Resolv Klasse. Das -Objekt hat ein defined_class-Attribut, aber das enthält wer zum Zeitpunkt der Klassendefinition selbst (das war nil, aka (main)), und nicht die Klasse, deren Definition im Begriff ist, verarbeitet werden. Ich konnte auch nicht herausfinden, welche Datei und welche Zeile verarbeitet wurden. Dort ist eine binding Variable, aber es enthielt keine Variablen.

Wie kann ich das tun?

+0

Does not 'tp.lineno' und' Sie die Zeile tp.path' geben und Datei? – SteveTurczyn

+0

Ja, du hast Recht. Ich weiß nicht, wie ich das vermisst habe. Vielen Dank. –

Antwort

2

Der einzige Weg, ich weiß von alle Klassendefinitionen verfolgen würde und filtern sie mit TracePoint#self:

TracePoint.new(:end) do |tp| 
    if tp.self == Resolv 
    # yay, we are in 
    # tp.disable # use this to unset a trace point 
    end 
end.enable 
Verwandte Themen