在函数调用中解包table

不详细展开,这段示例代码展示了问题:

-- 加一个额外预定义参数
function one_more_arg(...)
    local args = {...}
    return function()
        print(table.unpack(args), "c")
    end
end

local my_new_print = one_more_arg("a", "b")
my_new_print()  -- "a   c"

显然在这种场景下解包table并不有效。哪位大神有办法使之有效,即让 print 接收到 "a", "b", "c"?目前我正在尝试避免修改 args,除非这是唯一的解决方案。

点赞
用户9058627
用户9058627
`table.concat (list [, sep [, i [, j]]])`

给定一个列表,其中所有元素均为字符串或数字,返回字符串list [i] .. sep .. list [i + 1] ··· sep .. list [j]。参数sep的默认值为空字符串,i的默认值为1,j的默认值为#list。如果i大于j,则返回空字符串。
2018-02-07 04:25:25
用户2656799
用户2656799

当你将 table.unpack() 作为函数的参数时,该参数应该没有其他参数或者是该函数的最后一个参数。否则,只有 table 的第一个值将被传递。

Lua总是根据函数调用的情况来调整其结果的数量。当我们将函数调用作为一条语句时,Lua会丢弃所有结果。当我们将调用用作表达式时,Lua只保留第一个结果。只有在调用是表达式列表中的最后一个(或仅有的)表达式时,我们才能得到所有的结果。这些列表出现在 Lua 中的四个构造中:多重赋值,函数调用的参数,表构造和返回语句。

来自 http://www.lua.org/pil/5.1.html

所以,如果您可以接受,您可以尝试将 unpack 放在末尾:

print("c", table.unpack(args))

或修改 args

2018-02-07 06:37:53