2012-03-30 6 views
5

definiert ist Ich arbeite an einem ziemlich großen Schienen Projekt bei der Arbeit. Manchmal muss ich Klassen-/Konstanten-Definitionen aufspüren. Gibt es eine eingebaute Methode in Ruby, um das für mich zu tun? Beispiel:Sehen Sie, wo ein Symbol in irb

irb> SOME_CONSTANT.__file__ 
=> /some/path/to/a/file 
+1

Haben Sie versucht, in Ihrem Verzeichnis nur nach "SOME_CONSTANT =" zu suchen? –

+0

...................... ja? –

Antwort

1

Dies ist nicht genau das, was Sie suchen, aber Methoden tun haben eine .source_location-Methode auf sie. Sie können dies verwenden, um herauszufinden, wo eine Klasse tatsächlich implementiert ist. (Da Rubin können Sie Klassen wieder öffnen, dies an mehreren Stellen sein könnte)

zum Beispiel gegeben eine Instanz eines Objekts, i:

i.methods.map do |method_name| 
    method_obj = i.method(m) 
    file, line = method_obj.source_location 
    file #map down to the file name 
end.uniq 

wird Ihnen eine Liste aller Dateien, in denen i Methoden sind implementiert.

Dies funktioniert für Klassen, die mindestens eine Methode in Ruby implementiert haben. Es wird jedoch nicht für Konstanten funktionieren.

0

Gleich am Anfang, bevor eine Datei geladen wird, eine Zeile einzufügen, die die Klasse/Konstante definiert, dass Sie so etwas überprüfen möchten, dass andere als ein Modul. Angenommen, Sie haben innerhalb Ihres Codes eine Klasse oder eine andere Konstante A und möchten wissen, wo sie definiert ist. Dann gleich am Anfang der Hauptdatei, schreiben

A = nil 

Dann, wenn das Programm ausgeführt wird, wann immer es zunächst die Definition der Klasse erfüllt/constant A, wird es so etwas wie

zeigt
some_path_to_a_file:line_number in `some_method': A is not a class (TypeError) 

oder

some_path_to_a_file:line_number: warning: already initialized constant A 

Dann some_path_to_a_file:line_number wird der Ort, an dem A definiert ist.

0

Wenn Sie Ruby 1.9.2 verwenden, ist @ YenTheFirsts Antwort korrekt: Rufen Sie #source_location für ein Method-Objekt auf. Wenn Sie Ruby 1.8.7 verwenden, existiert #source_location (noch) nicht. Sie benötigen etwas wie this implementation einer Methode. (Es gibt noch ein oder zwei andere, aber ich kann den anderen nicht schnell finden).

+1

Laut http://stackoverflow.com/a/13015691/260122 gibt es (jetzt) ​​ein Juwel [ruby18_source_location] (https://github.com/ConradIrwin/ruby18_source_location), das 'Methode # source_location' zurückleitet. – clacke