Lua 变长函数参数为 nil

Posted

技术标签:

【中文标题】Lua 变长函数参数为 nil【英文标题】:Lua variable length function arguments are nil 【发布时间】:2016-08-03 16:30:14 【问题描述】:

我正在尝试在 lua 5.2 中编写 curry function。我的代码如下所示:

function add(a, b)
    return a + b
end

function curry(func, value)
    return (function (...)
        return func(value, table.unpack(arg))
    end)
end

add2 = curry(add, 2)

print(add2(3))

但参数arg 不包含传递给add2 函数的值。

当我尝试从 Lua documentation 运行示例时,它会出错,因为 arg 为 nil。

printResult = ""

function print (...)
  for i,v in ipairs(arg) do -- arg is nil
    printResult = printResult .. tostring(v) .. "\t"
  end
  printResult = printResult .. "\n"
end

如果这不起作用,我如何在 5.2 中使用可变长度函数?

编辑:

正如用户@siffiejoe 所指出的,我在这里的功能只是进行部分应用,而不是正确的柯里化。这是我使用已接受答案中的错误修复在 lua 中实现正确的咖喱函数。

function curry(func, params)        
    return (function (...)
        local args = params or         
        if #args + #... == debug.getinfo(func).nparams then
            local args = table.unpack(args)
            for _,v in ipairs(...) do
                table.insert(args, v)
            end
            return func(table.unpack(args))
        else
            local args = table.unpack(args)
            for _,v in ipairs(...) do
                table.insert(args, v)
            end
            return curry(func, args)
        end
    end)
end

请随时suggest changes and add test cases here

【问题讨论】:

请注意,这不是柯里化,而是部分应用。参见例如here 用于 Lua 中的柯里化(虽然在 C 中实现)。 感谢@siffiejoe 的澄清,我在原帖中添加了一个实际的咖喱函数。 我添加了一个指向 github 存储库的链接,其中包含该函数和一些测试用例。如果您有其他测试用例失败或者您有更优雅的解决方案,请随时发送拉取请求。 github.com/KelsonBall/LuaCurry 【参考方案1】:

从 Lua 5.1 开始,arg 在此上下文中已被 ... 替换(除了后者是列表而不是表)。

所以,table.unpack(arg) 应该只是 ...

见Breaking Changes。 Lua 参考手册非常好,尤其是这一节非常有用。

【讨论】:

啊。我正在尝试 table.unpack(...) 并得到奇怪的结果。

以上是关于Lua 变长函数参数为 nil的主要内容,如果未能解决你的问题,请参考以下文章

Lua学习笔记3. 函数可变参数和运算符转义字符串数组

lua函数调用

Lua中的基本函数库

Unix环境高级编程编写变长参数函数

Scala-变长参数

在 Lua 中将表及其子表设置为 nil 有啥区别?