我調查了getting the source code of a method如果它作爲一個文件存在,但沒有這個文件引用,是否有可能動態地打印一個方法的源代碼?看來我可以通過self.methods和每個方法的.arity
訪問類中的方法簽名。我相信ri_for gem是指原始源文件。我可以讓ruby打印動態方法的源代碼嗎?
更好的方法來解決這個問題:如果一個類在運行時擴展,它的源是否安全無法被調查?或者是僅限於方法簽名和實例變量名稱的調查能力,可能是類變量?
編輯:解決方法我用: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
在某個地方粘貼這一點,你可以得到源代碼了在運行時定義的類中取得了不錯的開局。
+1,但是它是ParseTree還是Ruby2Ruby? – 2011-04-07 23:44:09
謝謝,你的回答讓我檢查出SexpProcessor,並從那裏我能夠擴展模塊類與一個ro_ruby方法,傾倒出整個類的源代碼。 – mike 2011-04-14 13:20:15