Lua闭包在实现DSL中的应用

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" --错误
{
}

然而,如果我删除(tag)周围的括号,就会导致编译错误。那么为什么Lua允许无括号参数(即"def"),而不允许无括号变量(本例中为表)参数?

原文链接 https://stackoverflow.com/questions/1418070

点赞
stackoverflow用户126042
stackoverflow用户126042

来自Programming in Lua

如果函数只有一个参数,且此参数既可以是字面字符串,又可以是表构造器,那么圆括号是可选的:

据我理解,你上述的情况是tag是一个局部变量(不是一串字面字符串也不是表构造器),所以test(tag)总是需要括号。你在"def"周围不需要加括号,因为test(tag)返回一个接受单个字符串的函数,而该函数立即应用于"def"

2009-09-13 16:07:48