有可能在proc中看到ruby代码吗


p = Proc.new{ puts 'ok' }

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

inspect返回内存位置:

puts p.inspect
#<Proc:0x007f9e42980b88@(irb):2>

Ruby 1.9.3

看看sourcify宝石:

proc { x + y }.to_source
# >> "proc { (x + y) }"

你指的是原始源代码还是它的字节码表示?

对于前者,您可以使用标准Proc的方法source_location

p.source_location
=> ["test.rb", 21]

并读取适当的代码行。

对于后者,RubyVM::InstructionSequence及其类方法反汇编:可能会派上用场

irb> RubyVM::InstructionSequence.disasm p
=> "== disasm: <RubyVM::InstructionSequence:block in irb_binding@(irb)>
=====n== catch tablen| catch type: redo   st: 0000 ed: 0011 sp: 0000
cont: 0000n| catch type: next   st: 0000 ed: 0011 sp: 0000 cont:
0011n|------------------------------------------------------------------------n
0000 trace            1                                               
(   1)n0002 putself          n0003 putstring        "ok"n0005 
send             :puts, 1, nil, 8, <ic:0>n0011 leave            n"

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

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

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

所以,简单的答案是:不,没有办法。长期的答案是:有些方法有时可能有效,有时可能无效,这取决于太多的因素,甚至无法使其可靠地发挥作用。

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

如果proc被定义到一个文件中,U可以获得proc的文件位置,然后对其进行序列化,然后在反序列化后使用该位置再次返回到proc

proc_location_array=proc.source_location

反序列化后:

文件名=proc_location_array[0]

line_number=proc_location_array[1]

proc_line_code=IO.redlines(文件名([line_number-1]

proc_hash_string=proc_line_code[proc_line_code.index("{"(..proc_line-code.length]

proc=eval("lambda#{proc_hash_string}"(

虽然这是一个老问题,但我还是想分享我的想法。

你可以使用Pry-gem,最终得到这样的东西:

[11] pry> p = Proc.new{ puts 'ok' }
=> #<Proc:0x007febe00e6360@(pry):23>
[12] pry> show-source p
From: (pry)
Number of lines: 1
p = Proc.new{ puts 'ok' }

此外,如果您想在Rails上下文中使用它,您可以放置:

::Kernel.binding.pry

在您的控制器或型号中,以及

- require 'pry'; binding.pry

在您的视图中,在要开始调试的位置。

在测试中,我使用了一个组合,首先是顶部的require 'pry',然后是需要的::Kernel.binding.pry

参考文献:

  • http://pryrepl.org
  • https://github.com/pry/pry
  • https://github.com/pry/pry/wiki/Source-browsing

相关内容

  • 没有找到相关文章

最新更新