p = Proc.new{ puts 'ok' }
Run Code Online (Sandbox Code Playgroud)
有可能在proc中看到ruby代码吗?
inspect 返回内存位置:
puts p.inspect
#<Proc:0x007f9e42980b88@(irb):2>
Run Code Online (Sandbox Code Playgroud)
Ruby 1.9.3
看一下sourcify gem:
proc { x + y }.to_source
# >> "proc { (x + y) }"
Run Code Online (Sandbox Code Playgroud)
你的意思是原始的源代码或它的字节码表示?
对于前者,您可以使用标准的Proc方法 source_location
p.source_location
=> ["test.rb", 21]
Run Code Online (Sandbox Code Playgroud)
并阅读适当的代码行.
对于后者,RubyVM :: InstructionSequence及其类方法可以反汇编:
irb> RubyVM::InstructionSequence.disasm p
=> "== disasm: <RubyVM::InstructionSequence:block in irb_binding@(irb)>
=====\n== catch table\n| catch type: redo st: 0000 ed: 0011 sp: 0000
cont: 0000\n| catch type: next st: 0000 ed: 0011 sp: 0000 cont:
0011\n|------------------------------------------------------------------------\n
0000 trace 1
( 1)\n0002 putself \n0003 putstring \"ok\"\n0005
send :puts, 1, nil, 8, <ic:0>\n0011 leave \n"
Run Code Online (Sandbox Code Playgroud)
不,在 Ruby 中没有办法做到这一点。
一些 Ruby 实现可能有也可能没有获取源代码的特定于实现的方法。
您也可以尝试使用Proc#source_location查找Proc定义的文件,然后解析该文件以查找源代码。但是,如果Proc未在文件中定义(例如,如果它是用 动态定义的eval)或者源文件不再存在,例如因为您正在运行程序的 AOT 编译版本,那么这将不起作用。
所以,简短的回答是:不,没有办法。长答案是:有一些方法有时可能会或可能不会起作用,这取决于太多因素,甚至无法开始使这项工作可靠。
这甚至没有考虑Procs 甚至没有Ruby 源代码,因为它们是在本机代码中定义的。
| 归档时间: |
|
| 查看次数: |
5911 次 |
| 最近记录: |