lua--函数.变长参数 and 具名实参

本文介绍Lua语言中的变长参数与具名参数的使用方法,包括如何定义和调用带有变长参数的函数,如何处理变长参数中的nil值,以及如何使用具名参数简化函数调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

variable number of arguments :变长参数,指函数可以拥有不同数量的实参。

当函数需要一个或者多个参数时,可以使用...代替这些参数。此时...为表达式,表达式...的行为类似于一个具有多重返回值的函数,返回当前函数的所有参数。

e.g.

       function add(...)

       local s = 0

                 for i,v in ipairs{...} do      --{...} 代表一个由变长参数组成的数组

                       s = s+v

                 end

       return s

       end

       print(add(3,4,5,6,7))               -->25

既然...是表达式,就可以赋值给变量a,b:local a, b = ...


同样,变长参数也能拥有任意数量的固定参数,只需要将固定参数放在变长参数之前即可,那么余下的参数就属于变长参数。

e.g.

function fwirte(fmt,...)          --fmt为固定参数

return io.write(string.format(fmt,...))

end

fwrite()            --fmt = nil,无变长参数

fwrite("a")       --fmt="a"  ,无变长参数

fwrite("%d%d",4,5)       --fmt="%d%d" ,变长参数4,5


通常使用{...}即可访问变长参数,但是当变长参数中间包含一些nil值时就会出现问题

function test(...)

for i,v in ipairs{...} do

print(v)

end

end

test(1,2,3)   --> 1  2  3

test(1,2,3,nil)   --> 1  2  3

test(1,2,3,nil ,4)   --> 1  2  3

遍历时当遇到数组中的nil即终止遍历

此时需要使用函数select来访问变长参数。调用select,必须传入一个固定参数selector和一系列变长参数。如果selector = n,则返回弟n个可变实参,否则selector只能为#,select函数返回变长参数的总长度(包含nil,即使nil为最后一个值)。

print(select("#",1,2,3,nil))  -->4


for i=1,select("#",...) do              --select("#",...)返回变长参数总数

local arg = select(i,...)         --获的第i个参数

<循环体>

end



具名实参(named arguments):顾名思义,指具有名称的实参。

很多时候,当我们进行函数调用时,如果函数具有多个参数,我们往往会记不清各个参数代表什么意思。而lua的参数传递机制是具有位置性的,即实参是通过参数表中的位置和形参匹配起来的。这时该怎么办呢,如果能给实参指定具体的名字,不是就可以解决记不清参数代表什么了的问题了吗?

于是我们想这样调用函数:rename(old = "temp.lua", new = "temp1.lua")   但是lua不支持这种语法。

但是如果将这些具有名字的实参,组织到一个table构造式里,就ok了。

rename{old= "temp.lua", new = "temp1.lua"}      --  当实参只有一个table构造式时,函数圆括号可有可无

然后,我们在修改rename函数定义,将其改为只接受一个参数,并从这个参数中获取实际的参数

function rename(arg)

return os.rename(arg.old, arg.new)

end


e.g.2

在一个GUI库中,一个创建新窗口的函数可能具有许多参数,其中大部分是可选的,这是使用具名参数就很好

比如window函数里面会检查一些必填参数,或为某些参数添加默认值,然后调用_Window真正用于创建新窗口,而且要求所有的参数按照正确的次序传入。

那么可以这样写:

function window(opotions)

-- 检查必填参数

if type(options.title) ~= "string" then

error("no title")

elseif type(options.width) ~= "number" then

error("no width")

elseif type(options.height) ~= "number" then

error("no height")

end

--其他的参数都是可选的

_Window(options.title, 

   options.x or 0,   -- 默认值为0

   options.y or 0,   -- 默认值为0

           options.width, options.height, 

   options.background or  "white",    -- 默认值为 white

          options.border  -- 默认值nil

                            )

end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值