2011-04-07 15 views
6

Bunun bir dosya olarak var, ancak bu dosya referans olmadan, dinamik bir yöntemin kaynak kodunu yazdırmak mümkün olup olmadığını getting the source code of a method araştırdık? Ben sınıftaki yöntem imzalarına self.methods ve her yöntemin .arity ile erişebileceğim gibi görünüyor. Ben ri_for gem orijinal kaynak dosyaya atıfta inanıyorum.Ruby, dinamik bir yöntem için kaynak kodu yazdırabilir miyim?

bu soruyu çerçeveye daha iyi bir yolu: Bir sınıf çalışma zamanında uzatılırsa, kaynak araştırılmaktadır gelen güvenli? Veya yöntem imzasıyla sınırlı örnekleme ve örnek değişkenlerin isimleri, belki de sınıf değişkenleri?

Düzenleme: Çözüm kullandım: http://seattlerb.rubyforge.org/svn/ruby2ruby/1.2.1/lib/ruby2ruby.rb

class Ruby2Ruby < SexpProcessor 
    def self.translate(klass_or_str, method = nil) 
    sexp = ParseTree.translate(klass_or_str, method) 
    unifier = Unifier.new 
    unifier.processors.each do |p| 
     p.unsupported.delete :cfunc 
    end 
    sexp = unifier.process(sexp) 
    self.new.process(sexp) 
    end 
end 

class Module 
    def to_ruby 
    Ruby2Ruby.translate(self) 
    end 
end 

yerde bu yapıştırın ve çalışma zamanında tanımlanmış bir sınıf dışına kaynak kodunu alma konusunda oldukça iyi bir başlangıç ​​alabilirsiniz.

cevap

2

, kaynağı den güvenlidir araştırılıyor?

Hayır, güvenli değil. Örneğin, yöntemin gerçek çalışma zamanı kodunu belirlemek ve eşdeğer bir uygulamayı tersine mühendislik için ParseTree kullanılabilir. o parsetree veya Ruby2Ruby

+0

1, ama nedir? –

+0

Teşekkürler, cevabınız SexpProcessor'u kontrol etmemi sağladı ve oradan Modül sınıfını tüm sınıf kaynak kodunun dışına taşan bir ro_ruby yöntemi ile genişletebildim. – mike

5

Orada MR için Proc#to_source yöntemi hakkında konuşmak, ama AFAIK hiçbir şey (henüz) o geldi ediyor. sourcify mücevher Orada ancak, bir göz atın ve sizin ihtiyaçlarınıza uygun olup olmadığını görmek gerekir: Bir sınıf çalışma zamanında uzatılırsa

https://github.com/ngty/sourcify

İlgili konular