2

我意识到您可以使用更改块的绑定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!!!

有没有解决的办法?

4

1 回答 1

2

您可以通过以下方式解决它:

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

但我相信您无法更改现有Procinstance_eval/ instance_exec-ing 的绑定。

于 2012-07-20T21:37:40.947 回答