【问题标题】:Change Block Binding Without Eval?在没有评估的情况下更改块绑定?
【发布时间】:2012-07-20 21:17:38
【问题描述】:

我意识到您可以使用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.8 或 1.9 中这样做。 Rubinius 肯定有办法,但不是标准的Ruby。至少不是没有任何 C 代码。

标签: ruby binding proc


【解决方案1】:

你可以这样解决它:

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

但我相信您无法更改现有Proc 的绑定,而不能更改为instance_eval/instance_exec-ing 它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-20
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多