【问题标题】:How to extract the code from a Proc object?如何从 Proc 对象中提取代码?
【发布时间】:2011-08-09 15:25:34
【问题描述】:

给定一个 Proc 对象,是否可以查看其中的代码?

例如:

p = Proc.new{test = 0}

我需要通过某种方式从已创建的 Proc 对象中获取字符串“test = 0”。

【问题讨论】:

  • 对于网络搜索,另一种说法是“检查 Proc 中的代码”。
  • 问这个问题已经有几年了。有谁知道这方面最近有什么发展吗?
  • 更多最新答案:stackoverflow.com/a/15024732/109175 ("use sourcify")

标签: ruby


【解决方案1】:

您可以使用ruby2ruby 库:

>> # tested with 1.8.7
>> require "parse_tree"
=> true
>> require "ruby2ruby"
=> true
>> require "parse_tree_extensions"
=> true
>> p = Proc.new{test = 0}
>> p.to_ruby
=> "proc { test = 0 }"

您也可以将 proc 的这个字符串表示转回 ruby​​ 并调用它:

>> eval(p.to_ruby).call
0

此视频中有关 ruby​​2ruby 的更多信息:Hacking with ruby2ruby

【讨论】:

    【解决方案2】:

    如果您使用的是 Ruby 1.9,则可以使用 the sourcify gem

    $ irb
    ruby-1.9.2-p0 > require 'sourcify'
                 => true 
    ruby-1.9.2-p0 > p = Proc.new{test = 0}
                 => #<Proc:0xa4b166c@(irb):2> 
    ruby-1.9.2-p0 > p.to_source
                 => "proc { test = 0 }" 
    

    【讨论】:

    【解决方案3】:

    使用proc.source_location 获取定义过程的源文件的位置。 它还返回定义的行号。 您可以使用这些值来定位 proc 源的位置。

    【讨论】:

    • 这并不是这个问题的真正答案。但是,它帮助我调试了这样的问题,其中 proc 不是来自我认为的地方。所以+1。
    【解决方案4】:

    我认为您可以为此使用ParseTree,似乎对Ruby 1.9.2 的支持也是getting close

    【讨论】:

    • ParseTree 在 Ruby 1.8 中达到 EOL。
    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多