Lua的unpack()函数影响参数。

有这么一个测试函数,它简单地打印传递给它的值。

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

-- 正确
test1(1, 2, 3, 4) -- 输出 1 2 3 4
test2(1, 2, 3, 4) -- 输出 1 2 3 4

-- 错误
test1( unpack({1,2}), 3, 4) -- 输出 1 3 4
test2( unpack({1,2}), 3, 4) -- 输出 1 3 4 3

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

点赞
用户107090
用户107090

这种行为并不仅适用于 unpack

Lua 参考手册 说:

"函数调用和变长表达式都可以返回多个值。如果一个函数调用被用作一个语句(参见 §3.3.6),那么它的返回值列表被调整为零个元素,因此丢弃所有返回值。如果一个表达式被用作表达式列表的最后一个(或唯一一个)元素,那么不会进行调整(除非表达式被括在括号中)。在所有其他情况下,Lua 将结果列表调整为一个元素,要么丢弃除第一个元素以外的所有值,要么添加单个 nil(如果没有值)。"

(我的强调)

2015-04-27 10:01:44