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的主要内容,如果未能解决你的问题,请参考以下文章