在共同绑定下评估不同的块

时间:2014-03-17 23:56:03

标签: ruby block eval

我希望每个模块都带有一个通用的绑定环境,在这个环境中它可以评估不同的块。我有这样的代码打算这样做:

class Module
  def config &pr
    @binding ||= binding
    @binding.eval("pr.call")
  end
end

鉴于此,(我想)我可以在一个共同的绑定下调用不同的块:

class A; end
A.config{a = 3}
A.config{a} # => 3

但似乎传递给pr的字符串中的eval在第一次被调用时被固定到pr,所以从第二次起,它不会无论通过什么块;始终评估初始块:

A.config{a = 3}
A.config{} # => 3
A.config{:foo} # => 3

如何每次评估给定的块如下?

A.config{a = 3}
A.config{} # => nil
A.config{:foo} # => :foo
A.config{a} # => 3

0 个答案:

没有答案