2013-04-14 9 views
6

bir Basic Basic alt sınıfı hata ayıklama için harika olurdu! binding.pry içinde BasicObject

https://github.com/pry/pry

gözetlemek olduğunu söylüyor: "Egzotik nesne desteği (BasicObject örneklerini ..."

Ama bunun nasıl beklenebilir gibi bir BasicObject bağlayıcı anlamıyor

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

method_missing çağrılırken, nereden bağlanılır?

+0

Banister'ın cevapları daha iyi olduğunu ve daha temiz bir yaklaşım. Onun doğru olanı. – fmendez

cevap

8

doğrudan böyle Kernel üzerinde binding yöntemini çağırmak gerekir:

[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 üzerinde çağırmak arasında herhangi pratik bir fark vardır: ':: Kernel.send (: bağlanma) vs .pry'' :: Pry.send (: bağlayıcı) gerçekten aslında – fmendez

+0

Hmm, .pry' Ancak, Pry'nin sınıfının “bağlanma” üzerinde hiçbir etkisi olmayacağından, “Pry” ile bunu söylemek garip görünüyor. Bunun yerine, 'Çekirdek' aracılığıyla çağrı yapmak, aslında 'bağlanma' yöntemi burada tanımlandığı için daha az rastlantısal görünüyor. – horseyguy

+0

'Send' kullanmak zorunda değilsiniz, :: Kernel.binding bir modül fonksiyonu olduğu için iyi çalışıyor. –

2

BasicObject öğesinden devralınması size bir Blank Slate (tüm pry instance yöntemi de kaldırılmış) verecektir. Bunu biraz daha manuel yapmanız gerekecek.

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 

çıkışı (kaldıraç oturumu açtı): Mesela

☺ 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

Teşekkürler, bu çalışma – Ernst

+0

@Ernst banister'ın cevapları daha iyi ve daha temiz bir yaklaşım. Onun doğru olanı. meraktan – fmendez

İlgili konular