2012-03-30 11 views
5

Pracuję nad bardzo dużym projektem szyn w pracy. Czasami muszę polować na definicje klasy/stałej. Czy istnieje jakiś wbudowany w Ruby sposób, aby zrobić to dla mnie? Przykład:Zobacz, gdzie symbol jest zdefiniowany w irb

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

Czy próbowałeś już szukać w katalogu "SOME_CONSTANT ="? –

+0

...................... tak? –

Odpowiedz

1

Nie jest to dokładnie to, czego szukasz, ale metody do mają metodę .source_location na nich. Możesz go użyć, aby dowiedzieć się, gdzie faktycznie jest zaimplementowana klasa. (Ponieważ Ruby pozwala ponownego zajęcia, to może być w wielu miejscach)

na przykład, ze względu na wystąpienie obiektu, 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 

daje listę wszystkich plików w miarę Wprowadzono metody i.

Będzie to działać w przypadku klas, które mają co najmniej jedną metodę zaimplementowaną w ruby. Nie będzie jednak działać dla stałych.

0

Na samym początku przed każdym załadowaniu pliku wstawić linię, która definiuje klasę/stały, który chcesz sprawdzić, jak coś innego niż moduł. Załóżmy na przykład, że w kodzie mamy klasę lub inny rodzaj stałej A i chcemy wiedzieć, gdzie jest ona zdefiniowana. Następnie, na początku głównego pliku, napisz

A = nil 

wtedy, gdy program jest uruchamiany, gdy po raz pierwszy spełnia definicję klasy/stałej A, pokaże coś takiego

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

lub

some_path_to_a_file:line_number: warning: already initialized constant A 

Następnie some_path_to_a_file:line_number będzie mieć miejsce, w którym A jest zdefiniowana.

0

Jeśli używasz Ruby 1.9.2, odpowiedź @ YenTheFirst jest prawidłowa: zadzwoń na #source_location w obiekcie Method.

Jeśli używasz Ruby 1.8.7, to #source_location nie istnieje (jeszcze). Będziesz potrzebował czegoś w rodzaju metody this implementation. (Jest jeszcze jeden lub dwa, ale nie mogę znaleźć drugiego naprawdę szybko).

+1

Według http://stackoverflow.com/a/13015691/260122 istnieje (teraz) klejnot [ruby18_source_location] (https://github.com/ConradIrwin/ruby18_source_location), który obsługuje 'Method # source_location'. – clacke

Powiązane problemy