如何从Proc对象中提取代码?

jua*_*aid 20 ruby

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

例如:

p = Proc.new{test = 0}
Run Code Online (Sandbox Code Playgroud)

我需要的是从某个已经创建的Proc对象获取字符串"test = 0"的方法.

mik*_*iku 15

您可以使用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 }"
Run Code Online (Sandbox Code Playgroud)

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

>> eval(p.to_ruby).call
0
Run Code Online (Sandbox Code Playgroud)

有关ruby2ruby的更多信息,请参阅此视频:使用ruby2ruby进行黑客攻击.


Sea*_*ere 13

如果您使用的是Ruby 1.9,则可以使用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 }" 
Run Code Online (Sandbox Code Playgroud)

  • sourcify gem现在没有维护:https://github.com/ngty/sourcify/issues/34#issuecomment-75375440 (4认同)

Rez*_*eza 12

使用proc.source_location得到定义PROC源文件的位置.它还返回定义的行号.您可以使用这些值来定位proc源的位置.