2013-03-12 15 views

cevap

4

&fooinstance_exec blok olarak foo geçirmeye çalışır ve zaten açık bir blok geçiyoruz. ve işareti atlama foo sadece (bir Proc örneğidir haricinde) diğer herhangi bir argüman gibi gönderir. Yani, şunu yapmayı deneyin:

bar = proc{ |*args, block| 
    puts *args 
    block.call 
    puts "bar" 
} 

instance_exec(1,2,3,foo,&bar) 

Ve aynı sonucu elde edersiniz:

instance_exec(1,2,3,foo) do |*args, block| 
    puts *args 
    block.call 
    puts "bar" 
end 

Bu aynı zamanda böyle bir şey yapmak anlamına gelir. Bu parti için yaklaşık 3 yıl geciktim Difference between block and &block in Ruby

+2

Ne yazık ki bu benim durum için çalışmaz. Mevcut bir provayı, yürütme süresini takip etmeme izin verecek şekilde şeffaf bir şekilde sarmaya çalışıyorum. Sarma işlemimin imzası üzerinde hiçbir kontrolüm olmadığından, bu yöntemi kullanamıyorum. Genel olarak bu iyi bir çalışma gibi görünüyor. – Ajedi32

2

de

diğer bilgiler, ama ben sadece bir ova yerine, daha gerçek bir blok gibi iç blok tedavi edelim bir yaklaşım paylaşmak istedim eski argüman.

bu konuda gitmek I'in en iyi yol, bir bağlayıcı olarak olarak hareket edebilir ve bir yöntem olarak, dış blok tanımlamak için bir nesne oluşturmaktır. Ben orijinal örneği yeniden Yani eğer yerine instance_exec çağrısının scope_object.bound_proc çağırabilir Şimdi

scope_object = Object.new 
scope_object.define_singleton_method :bound_proc, &outer_proc 

bir nesne üzerinde bir yöntem olarak

inner_proc = proc { puts "inner" } 
outer_proc = proc { |*args, &inner_block| 
    puts *args 
    inner_block.call 
    puts "bar" 
} 
Biz tanımlayabilirsiniz

outer_proc ... instance_exec çağrısı olmadan aşağıdaki gibi yukarıdaki.

scope_object.bound_proc 1, 2, 3, &inner_proc 

Sen alırsınız:

1 
2 
3 
inner 
bar 

, maalesef bir LocalJumpError alırsınız Bunun yerine inner_block.call daha outer_proc iç verim çalışırsanız, neden tamamen emin değilim. Birisi bu cevabı varsa o zaman ilgilenirim.

+0

Çalışıyor! çok teşekkürler! – benjaminchanming