2012-03-26 19 views
14

pry'u kullanarak, bir yöntemin tanımlandığını bulmak ve kaynağı edit-method komutuyla görmek çok kolaydır. Yine de sınıfın kendisi için yazışma yoktur. Bu sınıfın kendini tanımladığı bir yöntem yoksa, kaynağı pry aracılığıyla bulmak zor.Ruby'de bir sabitin nerede tanımlandığını nasıl bulabilirim?

Sınıflar sabittir, dolayısıyla belirli bir Ruby sabitinin tanımlandığı kaynağı nerede bulacağını sormak eşdeğerdir. Çok teşekkür ederim.

+1

parçasıdır? – Arsen7

+3

Önceki sorularınızın cevaplarını kabul edebilir misiniz? – Arsen7

+4

@ Arsen7 Ah bana hatırlattığın için çok teşekkür ederim. Bu topluluğa oldukça yeniyim. Onları şimdi kabul ettim. –

cevap

6

Kullanım ack katılan Modülleri içine gözetleme olanağı sağlayacak (ve Ruby) onu kullanmaya başvuruyorum. Bunun hakkında harika bir şey, Kabuk entegrasyonu özelliklerini kullanarak Pry içinden kendisini çağırabilmenizdir, genellikle sadece .ack ClassName yazmanız hile yapmaz, ancak sınıfın geçerli dizinin altındaki bir dosyada tanımlanmasını gerektirir.

Sınıfın geçerli dizinde tanımlanmaması durumunda, her zaman yöntemlerinden birini arama, kaynak konumunu oradan alma ve ardından görüntülemek için Pry'nin cat komutunu kullanarak sözdizimini kullanabilirsiniz. veya doğrudan tanımına atlamak için Pry'nin edit komutunu vurgulayın. Bir sınıf tanımlanmış herhangi bir oluşum yöntemleri var ETMEZ

durum oldukça nadirdir - ve böyle bir sınıf zaten genellikle oldukça ilgi çekmeyen :)

DÜZENLEME:

gözetlemek en yeni sürümü (0.9.9) şimdi normal show-source komutunu kullanarak modül/sınıfların kaynağını gösterebilir. Modül/sınıfın en az bir tanımlı yönteme sahip olmasını gerektirir, ancak

1

Eh here belirtildiği gibi bu pry teklifi kullanmaktan daha biraz daha sürebilir Module.constants(true) deneyebilirsiniz ama burnumu sınırlarını ulaşırsanız bazen size

+0

Bununla birlikte, kaynak konumunu bulmak için bir yol gibi görünmüyor. –

2

Aradığınız sabitin yöntemleri varsa (bir sınıf veya modül), nerede tanımlandığını bulmak için Yöntem sınıfını kullanabilirsiniz.

class Foo 
    def bar 
    end 

    def self.baz 
    end 
end 

Foo.instance_method(:bar).source_location 
Foo.method(:baz).source_location 

kesmek Biraz saf sabitleri ile yardımcı olmuyor class Foo; BAHZ = 2; end ama hiç yoktan iyidir.

6

Ruby'de $", Kernel.load aracılığıyla yüklenen tüm dosya adlarını tutar.

constant = User 
$".detect{|load_path| 
    load_path.include?(constant.to_s.underscore) 
} 

Not: Yani böyle bir şey deneyebilirsiniz yöntem underscore Raylar/ActiveSupport Nasıl `grep` hakkında

+0

Bu harika bir öneri! – sandstrom

+0

Harika cevap. Ruby'de 2.4.2'deki String'de benim için uygun değildi. 'Downcase' ile aldım, ama eğer sınıf adın birden fazla kelime ise, bir şekilde yılana çevirmen gerekiyor. –

İlgili konular