Lua中函数多返回值右侧追加值为何被截断?如何无表扩展?
Lua多值返回的截断规则与无Table扩展方案
先看测试用例:
function test() return 1, 2, 3 end -- 正常:输出 4 1 2 3 print (4, test()) -- 异常:输出 1 4 print (test(), 4)
为什么会出现截断差异?
Lua的多值返回规则很明确:当函数调用作为表达式列表的最后一个元素时,会返回所有多值;如果不是最后一个元素,只会返回第一个值,剩余值直接丢弃。
- 在
print(4, test())中,test()是表达式列表的最后一个元素,所以完整返回1、2、3,最终参数序列是4、1、2、3,输出正常。 - 在
print(test(), 4)中,test()是第一个元素,不是最后一个,所以只返回第一个值1,后续的2、3被丢弃,最终参数序列是1、4,输出异常。
不用Table如何在右侧追加值?
可以用匿名函数包裹,让原函数的多值返回与追加值共同构成新的多值序列,再作为唯一参数传入目标函数(此时匿名函数的调用是表达式列表的最后一个元素,会完整返回所有值):
print((function() return test(), 4 end)()) -- 输出:1 2 3 4
这种方式完全避开了table的限制,不用担心nil导致的长度计数问题——不管原函数返回的多值里有没有nil,匿名函数都会完整返回所有原返回值加上追加的4。
至于你尝试的table方案:
local ret = {test()} print(table.unpack(ret), 4)
问题出在table.unpack(ret)是print的第一个参数,不是最后一个,所以同样触发截断规则,只返回ret[1]也就是1,加上4后输出1 4。如果要让table方案生效,得把table.unpack(ret)放在最后位置,但这不符合你“在右侧追加值”的需求。
内容的提问来源于stack exchange,提问作者GreenScape
相关产品推荐
相关产品推荐

