2013-04-14 14 views
6

pry sarebbe perfetto per eseguire il debug di una sottoclasse di BasicObject!binding.pry in BasicObject

https://github.com/pry/pry dice che leva ha: "di supporto oggetto esotico (istanze BasicObject ..."

Ma come fare Come ci si può aspettare un BasicObject non capisce vincolante

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

Quando viene invocato method_missing, dove inviare il binding?

+0

risposte di ringhiera è una migliore e approccio più pulito. La sua è quella giusta. – fmendez

risposta

8

Avrete bisogno di chiamare direttamente il metodo binding su Kernel come questo:

[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

Per curiosità, c'è qualche differenza pratica tra il chiamarlo sul kernel: ':: Kernel.send (: binding) .pry' vs' :: Pry.send (: binding) .pry' – fmendez

+0

Hmm, in realtà non proprio , ma sembra strano chiamarlo tramite 'Pry' poiché la classe' Pry' non avrà alcun impatto sul 'binding'. Chiamarlo tramite 'Kernel' invece sembra un po 'meno arbitrario, dal momento che il metodo' binding' è effettivamente definito lì. – horseyguy

+0

Non è necessario utilizzare 'send', :: Kernel.binding funziona correttamente poiché si tratta di una funzione modulo. –

2

Dal momento che ereditare da BasicObject ti darà un Blank Slate (anche tutto il metodo di istanza di leva rimosso) , dovrai farlo un po 'più manuale. Per esempio:

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 

uscita (sessione di leva aperta):

☺ 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

Grazie, questo funziona – Ernst

+0

Le risposte del banister di Ernst sono un approccio migliore e più pulito. La sua è quella giusta. – fmendez