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