Как я могу вызвать Proc, который принимает блок в другом контексте?

Возьмем этот пример 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
13
задан David Miani 26 March 2012 в 11:41
поделиться