irb

2012-03-30 18 views
5

'da bir sembolün nerede tanımlandığını görün Çalıştığımda oldukça büyük raylar üzerinde çalışıyorum. Bazen sınıf/sabit tanımları avlamak zorundayım. Ruby'de bunu benim için yapmam gereken bazı yerleşik yöntemler var mı? Örnek: herhangi bir dosya önce en başındairb

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

Dizininizde "SOME_CONSTANT =" için sadece grepping yapmayı denediniz mi? –

+0

...................... evet? –

cevap

1

Bu tam olarak aradığınız şey değil, ancak yöntemlerinde .source_location yöntemine sahip. Bir sınıfın gerçekte nerede uygulandığını bulmak için bunu kullanabilirsiniz. Bir nesnenin bir örnek verilmiş, örneğin

i (yakut derslere yeniden olanak sağladığı, bu birden fazla yerde olabilir):

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 

size tüm dosyaların nerede bir listesini verecektir i 'nun yöntemleri uygulanmaktadır.

Bu, yakutta uygulanan en az 1 yönteme sahip sınıflar için çalışacaktır. Yine de, sabitler için çalışmayacak.

0

bir modül başka bir şey olarak denetlemek istediğiniz o sınıfı/sabit tanımlayan bir satırı ekleyin, yüklenir. Örneğin, kodunuzda sınıfa veya başka bir sabit A türüne sahip olduğunuzu ve nerede tanımlandığını öğrenmek istediğinizi varsayalım. Daha sonra, ana dosyanın en başında, ilk sınıfın tanımını karşılayan her programı çalıştırılır Sonra

A = nil 

,/sabit A yazma, bu

some_path_to_a_file:line_number in `some_method': A is not a class (TypeError) 
gibi bir şey göstereceğim

veya sonra

some_path_to_a_file:line_number: warning: already initialized constant A 

, some_path_to_a_file:line_number A tanımlandığı yer olacaktır.

0

Ruby 1.9.2 kullanıyorsanız, @ YenTheFirst'ün yanıtı doğru: bir Method nesnesinde #source_location numaralı telefonu arayın.

Eğer Ruby 1.8.7 kullanıyorsanız, #source_location (henüz) mevcut değil. Bir yöntemin this implementation gibi bir şeye ihtiyacınız olacak. (Başka bir ya da iki tane etrafta dolaşıyor, ama diğerini hızlıca bulamıyorum).

+1

http://stackoverflow.com/a/13015691/260122 adresine göre, şu anda bir metod olan [ruby18_source_location] (https://github.com/ConradIrwin/ruby18_source_location) metodunu 'Method # source_location' olarak adlandırmaktadır. – clacke