【问题标题】:Can I make ruby print the source code for a dynamic method?我可以让 ruby​​ 打印动态方法的源代码吗?
【发布时间】:2011-08-01 00:55:12
【问题描述】:

我调查了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  

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

【问题讨论】:

    标签: ruby dynamic methods


    【解决方案1】:

    如果一个类在运行时被扩展,它的源代码是否安全?

    不,这不安全。例如,ParseTree 可用于确定该方法的实际运行时代码,并对等效实现进行逆向工程。

    【讨论】:

    • 谢谢,您的回答让我检查了 SexpProcessor,从那里我能够使用转储整个类源代码的 ro_ruby 方法扩展 Module 类。
    【解决方案2】:

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

    https://github.com/ngty/sourcify

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      相关资源
      最近更新 更多