- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 lua 的新手,我正在尝试创建一个配置 DSL,它允许具有已经具有默认值的部分。
因此,java 表预定义了很多值
java = {
source = 1.6,
target = 1.6,
directories = {
sources = "src/main/java",
output = "build/clases",
},
}
我有一个实现了 __call 的 Config 原型(prototype),这样当作为一个带有表构造函数的函数被调用时,它只会覆盖默认值。像这样的东西:
Config.__call = function(t, props)
for k,v in pairs(props) do
t[k] = v
end
end
这个想法是你可以只调用 dsl 来指定你想要覆盖的内容:
java {
source = 1.5,
directories {
sources = "customsrcdir",
}
}
有一个 Config.new 方法允许递归地将原型(prototype)应用到表中,以便所有表都有一个设置了 __call 方法的元表。
我的问题是“目录”小节。它是在全局范围内评估的,因此唯一可行的方法是:
java {
source = 1.5,
java.directories {
sources = "customsrcdir",
}
}
这是没有意义的,因为这和做是一样的:
java {
source = 1.5
}
java.directories {
sources = "customsrcdir",
}
我尝试了不同的方法来让所需的 DSL 工作。一个是使用 _ENV 设置自定义全局环境,但后来我意识到该表是在 __call 之前评估的。
我想知道是否有更多 lua 经验的人使用更高级的表/元表/_ENV 魔法实现了这样的 DSL。
最佳答案
可以按您的方式调用,但解决方案非常复杂,不值得省略 =
。如果您仍然想要表格合并/替换功能,那并不太难。
local function merge(t1, t2)
for k, v in pairs(t2) do
-- Merge tables with tables, unless the replacing table is an array,
-- in which case, the array table overwrites the destination.
if type(t1[k]) == 'table' and type(v) == 'table' and #v == 0 then
merge(t1[k], v)
else
t1[k] = v
end
end
end
local data = {
java = {
source = 1.6,
target = 1.6,
directories = {
sources = "src/main/java",
output = "build/classes",
},
}
}
local dsl = {}
load( [[
java = {
source = 1.5,
directories = {
sources = "customsrcdir",
},
}
]], 'dsl-config', 't', dsl)()
merge(data, dsl)
转储数据
将导致:
java = {
directories = {
output = "build/classes",
sources = "customsrcdir"
}
source = 1.5,
target = 1.6
}
关于lua - 使用 __call 与 lua 创建 DSL,如何实现小节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772271/
我正在尝试在 java 中获取 RenderedImage 的一个子部分。例如,图像是 100x100,我想要该图像的右下角 RenderedImage i=... x=49; y=4
对算法/数据结构还是很陌生,一直在尝试学习如何应用快速排序。 我发现了以下实现:https://www.geeksforgeeks.org/quick-sort/ 让我感到困惑的部分: /* The
我正在使用 Bootstrap 的“typeahead”插件。 我使用ajax加载数据,如下所示: $.ajax({ type: "POST", url
[环境:Win 7,R 3.2.3,RStudio,最新] 我有一个 knitr .Rmd 文档作为文章,我想在其中标记部分,如 ## Mean differences {#sec:meandiff}
我是一名优秀的程序员,十分优秀!