Возьмем этот пример Proc:
proc = Proc.new {|x,y,&block| block.call(x,y,self.instance_method)}
Он принимает два аргумента, x и y, а также блок.
Я хочу выполнить этот блок, используя разные значения для себя.Что-то вроде этого почти работает:
some_object.instance_exec("x arg", "y arg", &proc)
Однако это не позволяет вам проходить в блоке.Это также не работает
some_object.instance_exec("x arg", "y arg", another_proc, &proc)
и
some_object.instance_exec("x arg", "y arg", &another_proc, &proc)
Я не уверен, что еще может работать здесь.Возможно ли это, и если да, то как вы это делаете?
Редактировать: В основном, если вы можете передать этот файл rspec, изменив метод change_scope_of_proc
, вы решили мою проблему.
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