Lua unpack()搞乱参数

luk*_*nis 6 lua

我有这个测试功能,它只是打印传递给它的值

function test1(...)
  for k, v in ipairs(arg) do
    print(v)    
  end
end

function test2(...)
  for k, v in pairs(arg) do
    print(v)    
  end
end

-- GOOD behavior
test1(1, 2, 3, 4) -- produces 1 2 3 4
test2(1, 2, 3, 4) -- produces 1 2 3 4

-- BAD behavior
test1( unpack({1,2}), 3, 4) -- produces 1 3 4
test2( unpack({1,2}), 3, 4) -- produces 1 3 4 3
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这种行为吗?

lhf*_*lhf 6

此行为并非特定于unpack.该Lua的参考手册说:

"函数调用和vararg表达式都可能导致多个值.如果函数调用用作语句(参见§3.3.6),则其返回列表将调整为零元素,从而丢弃所有返回值.如果表达式为用作表达式列表的最后一个(或唯一的)元素,然后不进行任何调整(除非表达式括在括号中).在所有其他上下文中,Lua将结果列表调整为一个元素,要么丢弃所有值,除了如果没有值,则第一个或添加一个nil. "

(我的重点)