Lua函数参数丢失问题:为何调用时部分参数未正常传递?
问题解决
你的代码出现异常的原因是Lua的语法规则限制:在函数调用的参数列表中,如果...不是最后一个参数,它只会展开第一个可变参数,剩余的可变参数会被直接丢弃,所以f(..., "Maxi")实际等价于f(select(1, ...), "Maxi"),最终只传入了1和"Maxi"。
要实现“在可变参数末尾追加额外参数”的需求,推荐用以下两种方式:
方式一:借助表和table.unpack(通用且直观)
function ExecuteWithMyNameAtTheEnd(f, ...) local args = {...} -- 将可变参数存入表中 table.insert(args, "Maxi") -- 追加额外参数 f(table.unpack(args)) -- 展开表中所有参数传入函数 end ExecuteWithMyNameAtTheEnd(print, 1, 2, 3)
运行这段代码会输出预期的1 2 3 Maxi。
方式二:使用select动态展开参数(适合参数数量固定的场景)
function ExecuteWithMyNameAtTheEnd(f, ...) local arg_count = select("#", ...) -- 根据参数数量动态展开所有可变参数,再追加额外参数 f(select(1, ...), select(2, ...), select(3, ...), "Maxi") end
不过这种写法需要提前知道参数数量,通用性不如第一种方式。
另外补充:你之前测试print(...)能输出所有参数,是因为此时...是函数调用的唯一参数,Lua会自动展开所有可变参数;但当它后面跟其他参数时,就会触发上述的语法限制。
内容的提问来源于stack exchange,提问作者Maxi
相关产品推荐
相关产品推荐

