2013-04-14 4 views
6

pryはBasicObjectのサブクラスをデバッグするのに最適です!それを行う方法 "...エキゾチックなオブジェクトのサポート(BasicObjectインスタンス" をBasicObjectのbinding.pry

をしかし BasicObjectが結合理解できないと予想され得るように

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

https://github.com/pry/pryはてこを持っていると言っています?。

method_missingが呼び出されたときにバインディングを送信する場所

+0

手すりの答えは優れていますよりクリーンなアプローチ。彼は正しい人です。 – fmendez

答えて

8

あなたが直接このようなKernelbindingメソッドを呼び出す必要があります:

[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> 
+0

好奇心の念で、カーネルで '' Kernel.send(:binding).pry'と ':: Pry.send(:binding).pry'を呼び出す間に実用的な違いがありますか? – fmendez

+0

'Pry'クラスは'束縛 'に影響を与えないので' Pry'を通して呼び出すのは変です。代わりに、 'binding'メソッドが実際に定義されているので、' Kernel'を通してそれを呼び出すことはやや恣意的ではないようです。 – horseyguy

+0

あなたは 'send'を使う必要はありません:: Kernel.bindingはモジュール関数なのでうまく動作します。 –

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 

出力(てこセッションが開かれた):

☺ 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 
+0

ありがとうございます、これは動作します – Ernst

+0

@珍しい怒りの答えは、より良い、よりクリーンなアプローチです。彼は正しい人です。 – fmendez

関連する問題