Lua - 调用一个比定义参数更多的函数

由于某种原因,我需要理解一段未注释的 Lua 代码块。虽然我没有在 Lua 中工作,但我能够根据多种其他语言的知识来理解它。有一件事让我感到惊讶,而且我不知道如何理解它(因为我在其他语言中从未遇到过):

定义了一个带有一个参数的函数:

function dosomething(a)
  ...
end

没有其他对该函数的定义。并且该函数仅在程序的一个位置被调用 - 使用两个参数:

  dosomething(a, b)

根据上下文和名称,调用的第一个参数确实打算是函数的第一个参数。现在,其他参数呢?已经试图使用谷歌搜索,但迄今为止没有运气...

谢谢帮助。

点赞
用户107090
用户107090

任何额外的参数都会被忽略。

任何缺失的参数都会被赋予值为nil。

2021-05-16 13:54:32
用户2858170
用户2858170

尝试了谷歌搜索,但到目前为止都没有收获...

下次尝试 Lua 手册。

Lua 5.4 参考手册 3.4.11 - 函数定义

参数相当于局部变量,其值初始化为参数值:

parlist ::= namelist [',' '...'] | '...'

当调用 Lua 函数时,它会将参数列表调整为其参数列表的长度,除非函数是 vararg 函数,该函数在其参数列表的末尾用三个点 ('...') 表示。

因此,定义为

function dosomething(a) end

的函数有一个参数 a

如果以 dosomething(c, d) 的形式调用 Lua,它将首先评估参数列表。因此,如果 d 是一个函数,它将被调用并替换为其返回值。

然后会发生赋值。对于所有赋值,值列表都将根据变量数进行调整。d 将被忽略,此时就剩下 a = c

请参阅3.3.3 赋值

Lua 允许多重赋值。因此,赋值的语法在左侧定义了一个变量列表,右侧定义了一个表达式列表。两个列表中的元素由逗号分隔:

stat ::= varlist '=' explist

varlist ::= var {',' var}

explist ::= exp {',' exp}

表达式在§3.4中进行了讨论。

在赋值之前,值列表被调整为变量列表的长度。如果值太多,则多余的值将被丢弃。如果值太少,则列表将扩展为 nil。

因此,a = b, c 变成了 a = ba, b = c 变成了 a, b = c, nil

2021-05-16 18:01:03