2010-03-18 3 views
6

C'est ce que je suis en train de faire:Ruby - Possibilité de passer un bloc en tant que param comme bloc réel à une autre fonction?

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}" } 

Sur la ligne où il est dit « instance.instance_eval {} block.call », je suis en train de trouver une autre façon de faire de la nouvelle variable d'instance Exécutez l'instance eval sur le bloc. La seule façon que je puisse penser pour le faire est de passer à instance_eval le bloc d'origine, pas comme une variable ou n'importe quoi, mais comme un vrai bloc comme dans l'exemple de test.

Des conseils?

Répondre

8

Oui. Vous pouvez passer le bloc à l'autre méthode en préfixant la variable de bloc avec une esperluette comme ceci:

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

La raison pour laquelle votre deviennent « classe: Object » est que Ruby utilise une portée lexicale. Cela signifie que vous-même dans puts "class: #{self.class}" fait référence à main, le contexte par défaut.

+0

Quoi ??? C'était aussi simple? Hahaha Merci! J'ai été coincé sur celui-ci pendant des jours! :) –

+0

le terme à rechercher était 'paramètres de bloc'; plus facile en rétrospective si :) – Gishu

Questions connexes