是否有可能在proc中看到ruby代码?

B S*_*ven 11 ruby block proc

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

Ste*_*fan 9

看一下sourcify gem:

proc { x + y }.to_source
# >> "proc { (x + y) }"
Run Code Online (Sandbox Code Playgroud)

  • 在Ruby 1.9之后,sourcify会发出任何警告。我对Ruby 2.1.2的source_method gem感到很幸运(该撬包含作为依赖项,因此在我需要的测试基础结构中已经可用)。我在这里有详细的答案:http://stackoverflow.com/questions/1675053/printing-the-source-code-of-a-ruby-block/36654421#36654421 (2认同)

Dav*_*ric 6

你的意思是原始的源代码或它的字节码表示?

对于前者,您可以使用标准的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)

  • `RubyVM` 是 YARV 的一个非标准扩展。它不是 Ruby 语言规范的一部分。MRI 没有,Rubinius 没有,MagLev 没有,JRuby 没有,IronRuby 没有。我宁愿不依赖仅适用于单个 Ruby 实现的东西。 (2认同)
  • 是的,MRI停留在1.8。MRI无意支持任何更高版本的Ruby。Matz自己很久以前就停止从事MRI工作,他专注于YARV(由Koichi Sasada编写),最近专注于MRuby(由他自己编写的ISO Ruby实现)。Ruby 1.9不是一种实现,它是一种语言。没有Ruby 1.9的正式实现,没有语言规范,并且满足该规范的每种实现都与其他规范一样正式。其中一些实现是YARV,MacRuby,JRuby和Rubinius。 (2认同)

Jör*_*tag 5

不,在 Ruby 中没有办法做到这一点。

一些 Ruby 实现可能有也可能没有获取源代码的特定于实现的方法。

您也可以尝试使用Proc#source_location查找Proc定义的文件,然后解析该文件以查找源代码。但是,如果Proc未在文件中定义(例如,如果它是用 动态定义的eval)或者源文件不再存在,例如因为您正在运行程序的 AOT 编译版本,那么这将不起作用。

所以,简短的回答是:不,没有办法。长答案是:有一些方法有时可能会或可能不会起作用,这取决于太多因素,甚至无法开始使这项工作可靠。

这甚至没有考虑Procs 甚至没有Ruby 源代码,因为它们是在本机代码中定义的。