LUA可变长参数 ... 三个点

摘要:
变量参数由参数列表末尾的三个点表示。他将收集所有参数,并将其放入变量参数公式(三点)。此表达式的值表示所有参数值。这类似于函数返回多个返回值的情况。如果变量参数表达式位于其他表达式内部或某些表达式的中间,则它只返回一个元素,例如:localcc,dd,ee=a,…,34。如果表达式是表达式列表中的最后一个表达式,则除非使用括号,否则它不会调整参数。第三个参数是一个变量参数,并取变量参数的其余参数

本文翻译自 LUA官方文档

When a function is called, the list of arguments is adjusted to the length of the list of parameters, unless the function is a vararg function, which is indicated by three dots ('...') at the end of its parameter list. A vararg function does not adjust its argument list; instead, it collects all extra arguments and supplies them to the function through a vararg expression, which is also written as three dots. The value of this expression is a list of all actual extra arguments, similar to a function with multiple results. If a vararg expression is used inside another expression or in the middle of a list of expressions, then its return list is adjusted to one element. If the expression is used as the last element of a list of expressions, then no adjustment is made (unless that last expression is enclosed in parentheses).

当一个函数被调用,除非是一个可变参数函数,否则函数调用时的参数长度与函数的参数一一对应。可变参数用三个点表示 ... ,在参数列表最后。一个可变参数不会有一个对应参数列表。他会收集所有的参数放进一个变参表式里(三个点)。这个表达式的值表示所有参数值。它与函数返回多返回值的那种情况是相似的。如果一个变参表达式在其它表达式内部或者在一些表达式的中间,他只返回是一个元素例如:local cc,dd,ee = a,...,34 。如果这个表达式是在表达式列表的最后一个,他不会对参数进行调和除非用一个括号。

As an example, consider the following definitions:

     function f(a, b) end
     function g(a, b, ...) end
     function r() return 1,2,3 end

Then, we have the following mapping from arguments to parameters and to the vararg expression:

     CALL            PARAMETERS
     
     f(3)             a=3, b=nil   --没有为b传参数则b为nil
     f(3, 4)          a=3, b=4     --参数一一对应
     f(3, 4, 5)       a=3, b=4     --多余传参数无作用
     f(r(), 10)       a=1, b=10    --可变参数在中间,表达值的值则是第一个变参列表元素
     f(r())           a=1, b=2     --可变参数在最后面,不受影响
     
     g(3)             a=3, b=nil, ... -->  (nothing)   --b参数和...参数都没有传参数则为nil
     g(3, 4)          a=3, b=4,   ... -->  (nothing)   --没有为可变参数传参则为nil
     g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8        --可变参数为最后一个,则自动收集参数列表到可变参数
     g(5, r())        a=5, b=1,   ... -->  2  3        --第二个参数b可传的是一个可变参,则b为可变参的第一个元素。第三个参数是个可变参他取可变参的剩余参数

 

免责声明:文章转载自《LUA可变长参数 ... 三个点》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ABP 继承 ISoftDelete 后调用 HardDeleteAsync 实现物理删除使用cronolog按日期分割日志下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多线程中的lua同步问题

最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定。经过简单分析之后,确定是线程同步的问题。于是便修改了线程通信的代码,并使用pthread_mutex_lock/unlock来防止冲突。重新编译后,崩溃频率有所减少。但是每运行约四十次...

lua中dofile、loadfile、require区别

1.loadfile——只编译,不运行 loadfile故名思议,它只会加载文件,编译代码,不会运行文件里的代码。比如,我们有一个hellofile.lua文件: 代码如下: print(“hello”);function hehe()print(“hello”);end 这个文件里有一句代码,和一个函数。试试用loadfile加载这个文件,如下代码:...

OpenResty学习指南(一)

我的博客: https://www.luozhiyun.com/archives/217 想要学好 OpenResty,你必须理解下面 8 个重点: 同步非阻塞的编程模式; 不同阶段的作用; LuaJIT 和 Lua 的不同之处; OpenResty API 和周边库; 协程和 cosocket; 单元测试框架和性能测试工具; 火焰图和周边工具链; 性...

lua文件读写

lua里的文件读写模型来自C语言,分为完整模型(和C一样)、简单模型。 1、简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为把柄,有了把柄就可以找到文件),返回文件句柄。 io.output([file])设置默认的输出文件,参数意义同上。 io.close([file])关闭文件,...

nginx安装配置lua支持

nginx安装很简单,配置lua相关的支持就需要额外的安装一些库和编译。 一、准备环境 yum -y install lua*wget https://luajit.org/download/LuaJIT-2.0.4.tar.gz wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar...

创建cocos2dx lua 工程

-- 引擎版本 coco2dx 3.1.1 引擎的创建过程实际上从 hellolua 复制了一份出来,然后更改包名,路径名。 需要注意的是,通过命令行build的时候每次都会复制一堆脚本出来,这其中包含错误文件。需要将源头改正确 -- 重新创建工程过程记录 1.创建工程 cocos new chuanqi -p com.game.chuanqi -l l...