2010-05-03 6 views
27

Je sais que cela fonctionne:invoquant proc avec instance_eval avec des arguments?

proc = Proc.new do 
    puts self.hi + ' world' 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc 

Cependant, je veux passer des arguments à proc, alors j'ai essayé ce qui ne fonctionne pas:

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc, 'world' # does not work 
Usa.new.instance_eval &proc('world') # does not work 

Quelqu'un peut-il me aider à faire fonctionner?

+0

Vous avez une faute de frappe. 'gsub! (" gretting "," greeting ")' –

+0

réparé maintenant. Désolé pour ça. Merci Marc. –

Répondre

50

Utilisez instance_exec au lieu de instance_eval lorsque vous devez transmettre des arguments.

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello, " 
    end 
end 
Usa.new.instance_exec 'world!', &proC# => "Hello, world!" 

Note: il est nouveau pour Ruby 1.8.7, donc mise à niveau ou require 'backports' si nécessaire.

+2

Y a-t-il quelque chose que les backports ne peuvent pas faire? :-) –

+0

@ Jörg :-) J'aimerais qu'il n'y en ait pas ... Dommage que certaines choses soient hors de portée, comme 'Method # source_location' ou l'encodage. Et 'instance_exec' est le hack le plus laid de la gemme ... –

Questions connexes