Lua Closures实施DSL

时间:2009-09-13 16:02:34

标签: function lua dsl closures parentheses

Lua有一个非常好的无括号调用语法,加上函数闭包允许我编写以下内容

local tag = 1
function test(obj)
    return 
        function(str)
            return 
            function (tbl)
                tbl.objtag = tag
                tbl.objname = str
                return tbl
            end
        end

end
test (tag) "def"
{
}

test tag "def" --error
{
}

但是,如果我删除(标记)周围的括号,则会导致编译错误。那么为什么Lua允许无括号参数(即“def”)而不是无括号var(本例中为表)参数?

1 个答案:

答案 0 :(得分:3)

来自Programming in Lua

  

如果函数只有一个参数,并且该参数是文字字符串或表构造函数,则括号是可选的:

我对你的上述情况的理解是tag是一个局部变量(既不是文字字符串也不是表构造函数),因此test(tag)总是需要括号。你需要"def"左右的括号,因为test(tag)返回一个接受单个字符串的函数,该函数立即应用于"def"