8

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

https://github.com/pry/pry说 pry 有:“Exotic object support (BasicObject instances...”

但是怎么做呢?正如所料,BasicObject 不理解绑定。

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

调用 method_missing 时,将绑定发送到哪里?

4

2 回答 2

11

您需要像这样直接调用该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>
于 2013-04-14T23:38:24.100 回答
3

因为从 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

输出(撬开会话):

☺  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
于 2013-04-14T23:14:01.910 回答