【发布时间】:2010-02-22 14:34:10
【问题描述】:
我正在使用Blockenspiel 使用 Ruby 创建一个 DSL。它工作得很好 解决了我的很多问题,但是我遇到了以下问题 这与 Blockenspiel 没有严格的关系。
假设我有一个如下所示的 DSL:
dish do
name = 'Pizza'
ingredients = ...
nutrition_facts = ...
end
dish do
name = 'Doner'
ingredients = ...
nutrition_facts = ...
end
现在我有一个菜单编译器,它接收菜肴并将它们编译成 一份菜单。编译器现在应该能够编译多个菜单文件, 所以它已经设置并清除了一个全局上下文。这应该最好 并行发生。
我发现 sinatra 使用类变量,但这有 结果是它只能进行顺序处理并且你 当你想编译一个新的时必须清除类变量 菜单。另一种方法是使用全局变量。
我更愿意在一个范围内评估 DSL 方法 对象,这样就没有全局上下文,我可以编译 菜单并行,但我最后一次尝试这个时,我遇到了一些 在菜单文件中声明(helper-)方法时出现问题。
哪些方法可行?推荐的方法是什么?
【问题讨论】:
标签: ruby metaprogramming dsl