Lua - 使用定义的更多参数调用函数

Posted

技术标签:

【中文标题】Lua - 使用定义的更多参数调用函数【英文标题】:Lua - calling a function with more params that defined 【发布时间】:2021-08-05 23:48:26 【问题描述】:

出于某种原因,我需要了解一段未注释的 lua 代码。我不在 Lua 工作,但基于多种其他语言的知识,我能够充分理解它。不过,有一件事让我感到惊讶,我不知道如何理解它(因为我从未在其他语言中遇到过):

定义了一个函数,只有一个参数:

function dosomething(a) 
  ...
end

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

  dosomething(a, b)

根据上下文和名称,调用的第一个参数确实是函数的第一个参数。现在,另一个参数呢?尝试谷歌,但到目前为止没有运气......

感谢您的帮助。

【问题讨论】:

Lua 允许这样做,但 b 什么都不做。 谢谢。我想这可能是答案,但不愿意相信它:) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

尝试谷歌,但到目前为止没有运气......

下次试试 Lua 手册。

来自Lua 5.4 Reference Manual 3.4.11 - Function Definitions

参数充当局部变量,使用 参数值:

parlist ::= namelist [‘,’ ‘...’] | ‘...’ 当一个 Lua 函数是 调用时,它将参数列表调整为其参数列表的长度 参数,除非该函数是可变参数函数,即 由参数列表末尾的三个点('...')表示。

所以一个函数定义为

function dosomething(a) end

只有一个参数a

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

然后会发生分配。对于所有赋值,值列表将根据变量的数量进行调整。 d 将被忽略,留下a = c

参考3.3.3 Assignment

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

stat ::= varlist ‘=’ explist varlist ::= var ‘,’ var explist ::= exp ‘,’ exp 表达式在第 3.4 节中讨论。

赋值前,值列表调整为长度 变量列表。如果值多于所需值,则 多余的值被丢弃。如果值比需要的少, 列表用 nil 扩展。

所以a = b, c 变成a = ba, b = c 变成a, b = c, nil

【讨论】:

以上是关于Lua - 使用定义的更多参数调用函数的主要内容,如果未能解决你的问题,请参考以下文章

lua 函数调用的时候使用小括号和使用大括号有啥区别,如何定义?

C语言调用lua

Lua 函数

lua函数调用

Lua中调用C函数

Lua参数绑定函数实现方法