Tome este ejemplo Proc:¿Cómo puedo llamar a un Proc que toma un bloque en un contexto diferente?
proc = Proc.new {|x,y,&block| block.call(x,y,self.instance_method)}
Se toma dos argumentos, x e y, y también un bloque.
Quiero ejecutar ese bloque usando diferentes valores para mí mismo. Algo así casi funciona:
some_object.instance_exec("x arg", "y arg", &proc)
Sin embargo, eso no le permite pasar en un bloque. Esto también no funciona
some_object.instance_exec("x arg", "y arg", another_proc, &proc)
tampoco
some_object.instance_exec("x arg", "y arg", &another_proc, &proc)
No estoy seguro de qué otra cosa podría trabajar aquí. ¿Es esto posible y, de ser así, cómo lo haces?
Editar: Básicamente si puede obtener este archivo rspec para pasar cambiando el método change_scope_of_proc
, ha resuelto mi problema.
require 'rspec'
class SomeClass
def instance_method(x)
"Hello #{x}"
end
end
class AnotherClass
def instance_method(x)
"Goodbye #{x}"
end
def make_proc
Proc.new do |x, &block|
instance_method(block.call(x))
end
end
end
def change_scope_of_proc(new_self, proc)
# TODO fix me!!!
proc
end
describe "change_scope_of_proc" do
it "should change the instance method that is called" do
some_class = SomeClass.new
another_class = AnotherClass.new
proc = another_class.make_proc
fixed_proc = change_scope_of_proc(some_class, proc)
result = fixed_proc.call("Wor") do |x|
"#{x}ld"
end
result.should == "Hello World"
end
end
+1 para el suministro de la prueba a la superficie de manera explícita la cuestión – dbenhur
1 para la prueba, gracias, eso hace que sea muy fácil de ver lo que querer. – joelparkerhenderson