2010-03-18 21 views
6

Yapmaya çalıştığım şey:Ruby - Bir bloğu başka bir işleve gerçek bir blok olarak bir param olarak geçirebilir miyim?

def call_block(in_class = "String", &block) 
    instance = eval("#{in_class}.new") 
    puts "instance class: #{instance.class}" 
    instance.instance_eval{ block.call } 
end 


# --- TEST EXAMPLE --- 
# This outputs "class: String" every time 
"sdlkfj".instance_eval { puts "class: #{self.class}" } 

# This will only output "class: Object" every time 
# I'm trying to get this to output "class: String" though 
call_block("String") { puts "class: #{self.class}" } 

"instance.instance_eval {block.call}" yazdığı satırda, yeni örnek değişkenini çalıştırmak için başka bir yol bulmaya çalışıyorum blokta örnek değerlendirmesi. Bunu yapabilmek için düşünebilmemin tek yolu, bir değişken ya da herhangi bir şey olarak değil, test örneğinde olduğu gibi gerçek bir blok olarak orjinal bloğu örneklemek için.

Herhangi bir ipucu?

cevap

8

Evet. Öyle gibi bir ve işareti ile blok değişkeni prepending diğer yönteme bloğu geçirebilirsiniz:

def foo &blk 
    # now, blk is a variable bound to a block object 
    bar &blk 
end 

nedeni senin alıyorsanız "sınıfı: Object" Yakut sözcük kapsam belirleme kullanmasıdır. Bu, puts "class: #{self.class}"'daki kendinin varsayılan bağlam olan main anlamına gelir.

+0

Ne ??? Bu kadar basit miydi? Hahaha teşekkürler! Bu günlerde takıldım! :) –

+0

aranacak terimi 'blok parametreleri' idi; arka planda daha kolay olsa :) – Gishu

İlgili konular