Proc?

2013-10-01 15 views
7

Bir bloğa bir Proc aktarmanın mümkün olup olmadığını merak ediyorum. Basitçe çalışmıyor Proc.call bir blok geçirmeden:Proc?

foo = Proc.new { 
    yield 
} 

foo.call { 
    puts "test" 
} 

Sonuçlar içinde: Aynı lambdas ile olur

LocalJumpError: no block given (yield)

. içinde

class Foo 
    def bar 
    yield 
    end 
end 

bar = Foo.new.method :bar 

bar.call { puts "Success!" } 

Sonuçlar: Ancak bu yöntem nesnelerle çalışır

bar.to_proc.call { puts "Success!" } 
:

Success!

Garip olan şey ise hala proc haline yöntem nesne dönüştürme sonra çalışır olmasıdır

Sonuçlar:

Success!

Peki, bir bloktan yapılmış olan Proc nasıl blokları kabul etmiyor, ancak aslen bir yöntem olan Proc mu? Procs'u blokları kabul eden bloklardan oluşturmak mümkün mü?

+1

olası bir kopyası [Proc içinde bir bloğu değerlendirebilir miyim?] (Http://stackoverflow.com/questions/17818160/can-i-evaluate-a-block-inside-a-proc) –

+0

Hala açık Benim için ilgili soru: Verim sağlayan bloklardan elde edilen verim yöntemleri? –

cevap

5

Procs, blokları örtülü bağımsız değişkenler olarak kabul edemez (çalıştığınız biçim). Birno'lu proc, argümanlarını veya bağımsız olarak argüman olarak diğer proc nesnelerini alabilir. Örnek:

a = Proc.new do |&block| 
    block.call 
end 

a.call() {puts "hi"} 

yield sadece bir yöntem bağlamında çalışır Dili Atatürk seviye büyü biraz.

+2

Yani, * blokları * diğer blokları örtük argümanlar olarak kabul edemez mi? Çünkü sorgumda gösterdiğim gibi, procs * yöntemlerden prodüksiyona dönüştürüldüyse * olabilir. – Hubro

+0

@Codemonkey: Ben çok proc bir & argüman oluşturur eminim. – Linuxios

+0

Hmm ilginç. Çok yardımcı, teşekkürler! –

İlgili konular