当我调用 unpack() 作为 lua 的函数参数时会发生什么?

Neo*_*ang 7 lua arguments

这是我所看到的:

> function test(...)
>>  for i, v in ipairs({...}) do
>>    print(v)
>>  end
>>end

-- This is expected
> test(unpack({1,2}))
1
2
-- When I mix unpack and regular arguments
-- What happened to 2?
> test(unpack({1,2}), 3)
1
3
-- What happened to 3?
> test(unpack({}), 3)

-- When I put regular args before unpack, everything is fine:
> test(1, unpack({2, 3}))
1
2
3
Run Code Online (Sandbox Code Playgroud)

当我将解压的参数与常规参数混合时,结果很奇怪。您能解释一下幕后发生了什么吗?

Vla*_*lad 6

参见Lua手册中的解释:

如果表达式用作表达式列表的最后一个(或唯一的)元素,则不会进行任何调整(除非表达式包含在括号中)。在所有其他上下文中,Lua 将结果列表调整为一个元素,要么丢弃除第一个值之外的所有值

你完全明白了这一点。Unpack() 返回多个值,并且返回元素列表将调整为 1 个元素,除非它是 test() 参数中的最后一个表达式。


Pig*_*let 5

我将引用Lua参考:

\n\n
\n

函数调用和可变参数表达式都可以产生多个\n 值。如果表达式用作语句(仅适用于\n 函数调用(请参阅\xc2\xa72.4.6)),则其返回列表将调整为零\n 个元素,从而丢弃所有返回值。如果表达式被用作表达式列表的最后一个(或唯一的)元素,则不会进行任何调整(除非调用包含在括号中)。在所有其他上下文中,Lua 将结果列表调整为一个元素,并丢弃除第一个值之外的所有值。

\n
\n\n

正如您所看到的,您的 unpack 调用减少为一个返回值,因为它既不是您传递给测试的表达式列表中的最后一个也不是唯一的表达式:

\n\n
test(unpack({1,2}), 3)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在另一种情况下,答案很简单:

\n\n
test(unpack({}), 3)\n
Run Code Online (Sandbox Code Playgroud)\n\n

传递给测试的第一个值是 nil。因此for i, v in ipairs({...}) do end不会执行任何操作,因为表的第一个值是nil返回unpack({})nil

\n\n
\n

ipairs (t)

\n\n

返回三个值(迭代器函数、表 t 和 0),以便\n 构造

\n\n
 for i,v in ipairs(t) do body end\n
Run Code Online (Sandbox Code Playgroud)\n\n

将迭代键\xe2\x80\x93值对 (1,t[1]), (2,t[2]), ...,直到第一个 nil 值。

\n
\n