2013-08-20 7 views
8

Gibt es eine Möglichkeit, die Liste der Methoden zu erhalten, die eine Ruby-Methode implementieren, wenn diese Methode aufgerufen wird?Wie kann ich eine Ruby-Methode Abhängigkeiten finden?

Zum Beispiel:

def foo 
    puts "foo" 
end 

def foo2 
    foo 
end 

Ich will wissen, dass, wenn „foo2“ nannte es erste „foo“ und 2. „Puts“ und die entsprechenden Dateien ruft diese Methoden definiert in. (Wenn "puts" andere Methoden aufrufen, würde ich sie gerne auch kennen)

Ist das möglich? und wenn, ja 'wie? Ich könnte sagen, dass meine Frage darin besteht, die Methodenabhängigkeiten zu finden.

+2

Sie sind wahrscheinlich Flak für den Versuch, dies zu tun; Es ist nicht Aufgabe einer Methode, zu wissen, wer sie nennen kann (oder wer sie dafür genannt hat). Vielleicht möchten Sie Ihr Ziel/Problem teilen und sehen, ob es keine geeigneteren Lösungen gibt, und dabei helfen, Bedenken auszuräumen, die jemand hat, wenn es darum geht, schlechten Code zu schreiben. :) – coreyward

+10

Statische Kontrollflussanalyse ist für eine dynamische Sprache wie Ruby ziemlich schwierig. –

+2

Klingt wie ein Hack. Wenn Sie Aktionen in einer bestimmten Reihenfolge benötigen, warum legen Sie sie nicht auf die gleiche Weise, so dass es klar ist? Vielleicht stellen Sie eine andere Frage, aber Ihr Beispielcode macht nicht klar, warum Sie einen statischen Fluss durchsetzen wollen. Hast du ein realeres Beispiel? – jefflunt

Antwort

4

Sie können dies mit set_trace_func sortieren, aber da Ruby dynamisch ist, benötigen Sie auch Testcode, um die Methoden aufzurufen, so dass die Aufrufreihenfolge gedruckt wird.

set_trace_func proc { |event, filename, line, id, binding, klass| puts "#{klass}##{id}" } 

In Ruby 2.0, TracePoint ist eine bessere Alternative.

4

Statische Code-Analyse, insbesondere eine, die Sie durchführen möchten (Auflistung aller in einer Methode genannten Methoden), ist sehr schwierig in Ruby (fast unmöglich), weil die Sprache dynamisch ist und sehr starke Metaprogrammierungstechniken ermöglicht. Selbst der Parser selbst kennt die erforderlichen Methoden nicht, bis er versucht, den Code auszuführen.

Beispiel: Aufruf von eval mit Code aus einer Datei gelesen.

+0

Also, ich nehme an, dass Ihre Antwort "Nein" ist, ich kann das unmöglich tun. Ich kann das als Antwort akzeptieren, aber lasst uns anderen Kollegen etwas Zeit geben, um andere mögliche Antworten zu sammeln. –

Verwandte Themen