2012-02-27 17 views
7

instance_eval yöntem değişikliği öz, örneğin:Örnek_eval yöntemi gibi bir blokta kendini nasıl değiştiririm? kendi bloğunda

class D; end 
d = D.new 
d.instance_eval do 
    puts self # print something like #<D:0x8a6d9f4>, not 'main'! 
end 

biz baskı öz, biz 'ana alacak zaman, (bir blok alır instance_eval yönünden ve diğer yöntemleri (diğer)) kendimizi bir yöntem tanımlarsanız ' instance_eval method.eg farklı olan:

[1].each do |e| 
    puts self # print 'main' 
end 

Nasıl instance_eval gibi (bir blok taşır) bir usul tanımlayabiliriz? Şimdiden teşekkürler.

+0

ulaşmak istediğiniz ne yapmalı? – megas

+0

Ben senin istediğini yapmak mümkün olduğunu sanmıyorum. Muhtemelen kendini kendin değiştirebilirsen çok kafa karıştırıcı olurdu. Maalesef –

cevap

7

Sen instance_eval bir proc argüman olarak bu geçmesine sonra proc argüman kabul eden bir yöntem yazmak ve edebilirsiniz.

class Foo 
    def bar(&b) 
    # Do something here first. 
    instance_eval &b 
    # Do something else here afterward, call it again, etc. 
    end 
end 

Foo.new.bar {koyar öz}

Verim

#<Foo:0x100329f00> 
+0

Ne demek istediğini anlıyorum, ama sorunumu çözmedim. instance_eval kullanmak yerine instance_eval gibi bir yöntem tanımlamak istiyorum. Uygulamanın bir sarıcı değil, hepinize aynı olmasını istiyorum. – gaols

+1

Neyi başarmak istediğinizle ilgili daha spesifik olmanız gerekir. Bir bloğu kabul edebilen bir yöntem istiyorsanız ve bunu yönteminizle aynı bağlam içinde bir veya daha fazla kez yürütmek istiyorsanız, o zaman bunu yapar. Tahmin etmem gerekirse, belki de tartışmaları bloğa da aktarmak istersiniz? Bunun mümkün olduğunu biliyorum çünkü RSpec bunu yapıyor ve bu örnekte doğru değil. RSpec koduna bir göz atmalı ve nasıl yaptıklarını görmeliyim. –

+0

Aslında, RSpec'in engellemek için paramları geçmediğini ve blokları çağırmak için instance_eval işlevini kullandığını görüyorum. Http://rubydoc.info/gems/rspec-core/RSpec/Core/Example#run-instance_method adresine bakın ve "Kaynağı Görüntüle" ye tıklayın. –

3

çok açık:

class Object 
    def your_method(*args, &block) 
    instance_eval &block 
    end 
end 

receiver = Object.new 

receiver.your_method do 
    puts self #=> it will print the self of receiver 
end 
+0

, ne ben istiyorum sadece instance_eval gibi bir blok alır ve bu blok kendini alıcıya değiştirilir bir yöntemdir! – gaols

+0

Yardımlarınız için tekrar teşekkürler! – gaols