2012-03-30 20 views
5

Trabajo en un proyecto de rieles bastante grande en el trabajo. A veces necesito buscar definiciones de clase/constante. ¿Hay algún método incorporado en Ruby para hacer esto por mí? Ejemplo:Vea dónde se define un símbolo en irb

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

¿Ha intentado simplemente grepping para "SOME_CONSTANT =" en su directorio? –

+0

...................... ¿sí? –

Respuesta

1

Esto no es exactamente lo que estás buscando, pero los métodos do tienen un método .source_location en ellos. Puede usar esto para averiguar dónde se implementa realmente una clase. (Desde rubí le permite volver a abrir clases, esto podría estar en varios lugares)

por ejemplo, dada una instancia de un objeto, 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 

le dará una lista de todos los ficheros donde i se implementan los métodos.

Esto funcionará para las clases que tienen al menos 1 método implementado en ruby. Sin embargo, no funcionará para constantes.

0

En el comienzo antes de que cualquier archivo se carga, inserte una línea que define la clase/constante que desea comprobar como algo distinto de un módulo. Por ejemplo, supongamos que tiene clase u otro tipo de constante A dentro de su código, y desea saber dónde está definido. Luego, en el comienzo del archivo principal, escribir

A = nil 

Entonces, cuando se ejecuta el programa, siempre que primero cumpla con la definición de la clase/constante A, se mostrará algo así como

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

o

some_path_to_a_file:line_number: warning: already initialized constant A 

Entonces, some_path_to_a_file:line_number será el lugar en el que se define A.

0

Si está utilizando Ruby 1.9.2, la respuesta de @YenTheFirst es correcta: llame al #source_location en un objeto Method.

Si está usando Ruby 1.8.7, entonces #source_location no existe (todavía). Necesitará algo como this implementation de un método. (Hay otro uno o dos flotando, pero no puedo encontrar el otro muy rápido).

+1

De acuerdo con http://stackoverflow.com/a/13015691/260122, hay (ahora) una gema [ruby18_source_location] (https://github.com/ConradIrwin/ruby18_source_location) que hace una copia de seguridad 'Method # source_location'. – clacke

Cuestiones relacionadas