我可以让ruby打印动态方法的源代码吗?

时间:2011-04-07 20:43:06

标签: ruby dynamic methods

如果它作为文件存在,我调查了getting the source code of a method,但没有这个文件引用,是否可以动态打印方法的源代码?我似乎可以使用self.methods和每个方法的.arity来访问类中的方法签名。我相信ri_for gem指的是原始的源文件。

构建此问​​题的更好方法:如果某个类在运行时被扩展,那么它的源是否可以安全地被调查?或者是调查的能力仅限于方法签名和实例变量的名称,也许是类变量?

编辑:我使用的解决方案: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  

将其粘贴到某处,您可以从运行时定义的类中获取源代码。

2 个答案:

答案 0 :(得分:5)

关于MRI的Proc#to_source方法一直在谈论,但AFAIK没有任何结果(尚未)。但是有sourcify宝石,你应该看看它是否符合你的需要:

https://github.com/ngty/sourcify

答案 1 :(得分:2)

  

如果一个类在运行时被扩展,它的源是否可以安全地被调查?

不,这不安全。例如,ParseTree可用于确定方法的实际运行时代码并反向设计等效实现。