2010-05-03 6 views
27

Sé que esto funciona:invocando proc con instance_eval con argumentos?

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

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

Sin embargo, quiero pasar argumentos a proc, por lo que he intentado esto que no funciona:

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 

Puede alguien ayudarme a hacer que funcione?

+0

Tiene un error tipográfico. 'gsub! (" gretting "," greeting ")' –

+0

corregido ahora. Lo siento por eso. Gracias Marc. –

Respuesta

50

Use instance_exec en lugar de instance_eval cuando necesite pasar argumentos.

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

Nota: es nueva a Ruby 1.8.7, por lo que actualizar o require 'backports' si es necesario.

+2

¿Hay algo 'backports' * no puede * hacer? :-) –

+0

@ Jörg :-) Desearía que no ... Lástima que algunas cosas estén fuera de su alcance, como 'Método # ubicación_origen' o las cosas de codificación. Y 'instance_exec' es el truco más feo de la gema ... –

Cuestiones relacionadas