Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在没有Eval的情况下更改块绑定?_Ruby_Binding_Proc - Fatal编程技术网

Ruby 在没有Eval的情况下更改块绑定?

Ruby 在没有Eval的情况下更改块绑定?,ruby,binding,proc,Ruby,Binding,Proc,我意识到您可以使用instance\u 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

我意识到您可以使用
instance\u 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!!!

有办法解决这个问题吗?

你可以这样解决:

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

但是我相信,除了
实例评估
/
实例执行
,您无法更改现有
过程的绑定。

我非常确定您在1.8或1.9中都无法做到这一点。Rubinius肯定有办法,但不是标准的Ruby。至少没有任何C代码。