更改块绑定没有Eval?

时间:2012-07-20 21:17:39

标签: ruby binding proc

我意识到您可以使用instance_eval

更改块的绑定
class Foo
  def bar &block
    instance_eval &block
  end
end

Foo.new.bar { self } # returns the instance

但是一些内置方法接受块,在这种情况下,似乎不可能更改块的绑定而不会弄乱内置方法的内部。

class Foo
  def enum &block
    Enumerator.new &block
  end
end

Foo.new.enum { self }.each {} # returns main!!!

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

你可以这样解决:

class Foo
  def enum &block
    Enumerator.new do |*args|
      instance_exec *args, &block
    end
  end
end

但我相信你无法改变现有Procinstance_eval / instance_exec的约束力。