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

しかし、私はあなたがそれの/ -ingの既存のProc不足のバインディングを変更することはできないと確信しています。instance_evalinstance_exec

于 2012-07-20T21:37:40.947 に答える