BasicObject中的binding.pry

时间:2013-04-14 21:51:32

标签: ruby debugging proxy-classes pry

pry非常适合调试BasicObject的子类!

https://github.com/pry/pry说撬具有: “外来对象支持(BasicObject实例......”

但是怎么做? 可以预料的是,BasicObject不理解绑定。

 NameError:
   undefined local variable or method `binding' for #<C30Course:0xbefbc0c>

调用method_missing时,何处发送绑定?

2 个答案:

答案 0 :(得分:10)

您需要直接在binding上调用Kernel方法,如下所示:

[13] pry(main)> class O < BasicObject
              |   def hi
              |     x = 10
              |     ::Kernel.binding.pry
              |   end  
              | end  
=> nil
[14] pry(main)> O.new.hi

From: (pry) @ line 19 O#hi:

    17: def hi
    18:   x = 10
 => 19:   ::Kernel.binding.pry
    20: end

[1] pry(unknown)> x
=> 10
[2] pry(unknown)> self
=> #<O:0x3fd5310d04f8>

答案 1 :(得分:2)

由于继承自BasicObject会给你一个Blank Slate(所有pry实例方法也被删除),你将不得不更多地手动操作。例如:

require 'pry'
class Test < BasicObject
  def test_method
    a = 1+1
    ::Pry.send(:binding).pry
    b = 2+2
  end
end
o = Test.new
p o.test_method

输出(pry session打开):

☺  ruby hack.rb                                                            ruby-2.0.0-p0

From: .../quick_hacking/hack.rb @ line 5 Test#test_method:

    3: def test_method
    4:   a = 1+1
 => 5:   ::Pry.send(:binding).pry
    6:   b = 2+2
    7: end