2013-04-14 10 views
6

pry byłby świetny do debugowania podklasy BasicObject!binding.pry w BasicObject

https://github.com/pry/pry mówi, że pry posiada: "egzotycznych wsparcia przedmiot (instancje BasicObject ..."

Ale jak to zrobić Jak można oczekiwać BasicObject nie rozumie wiązania

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

Kiedy wywoływane jest wywołanie metody method_missing, gdzie należy wysłać powiązanie?

+0

odpowiedzi poręczy jest lepszy i czystsze podejście. Jego jest właściwy. – fmendez

Odpowiedz

8

Musisz bezpośrednio wywołać metodę binding na Kernel tak:

[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

Z ciekawości, czy jest jakaś praktyczna różnica między wywołaniem jej na Kernelu: ':: Kernel.send (: binding) .pry' vs' :: Pry.send (: binding) .pry' – fmendez

+0

Hmm, naprawdę nie tak naprawdę , ale wydaje się dziwne nazywanie tego przez 'Pry', ponieważ klasa' Pry' nie będzie miała wpływu na 'binding'. Wywołanie tego poprzez 'Kernel' zamiast tego wydaje się nieco mniej dowolne, ponieważ metoda" binding "jest tam faktycznie zdefiniowana. – horseyguy

+0

Nie musisz używać 'send', :: Kernel.binding działa poprawnie, ponieważ jest funkcją modułu. –

2

Ponieważ dziedziczenie z BasicObject da ci Blank Slate (usunięto również wszystkie metody wyszukiwania podrzędnego) , będziesz musiał zrobić to trochę więcej instrukcji. Na przykład:

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 

wyjścia (sesja wyważać otwarte):

☺ 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

Dzięki, to działa – Ernst

+0

@Reader banister's odpowiedzi jest lepszym i czystszym podejściem. Jego jest właściwy. – fmendez

Powiązane problemy