我的 Ruby DSL 的用户希望能够添加其他方法并在任意块的上下文中调用它们,例如:
def do_something
override 'flags', 'ABC'
end
project('XXX') do
configuration('debug') do
do_something
end
end
在此示例中,“覆盖”是使用 instance_eval 调用的配置对象的方法。
有没有办法强制在配置块的上下文中执行任何方法调用,以便例如可以解决和执行“覆盖”?
[编辑]
所以我构造了根 DSL 对象并评估如下:
root_dsl = DSL.new
root_dsl.instance_eval(File.read(filename))
这个 DSL 类有一个匹配上述示例中的“项目”的方法:
def project(&block) do
project_dsl = ProjectDSL.new
project_dsl.instance_eval(&block)
end
并且 project_dsl 类有一个与上面示例中的“配置”匹配的方法:
def configuration(name, &block) do
configuration_dsl = ProjectConfigDSL.new(name)
configuration_dsl.instance_eval(&block)
end
等等。用户希望他在 DSL 文件本身中定义的方法在 ProjectConfigDSL 对象的上下文中执行。