Lua函数中,实参的数量可以超过形参的数量,但是超过的部分会被舍弃,
当实参数量少于形参时,轮空的形参也会被设置为nil
如
function f (a,b)
return a or b ;
end
f(3) =>a=3,b=nul;
f(3,4) =>a=3,b=4;
f(3,4,5) =>a=3,b=4,(5被舍弃了)
多重返回值函数
Lua中函数可以一次返回多个值
多重返回值参数在作为参数的时候,还有特殊的处理
1.函数是作为最后一个一个参数使用,这时会全额返回所有返回值
2.左右参数组中的某一个参数,且不是在末尾,那么只会返回第一个形参的值
3.如果需要被赋值的参数数量大于函数的返回数量,那么超过的部分会用nil代替,除非函数后续有跟其他值;
如
function foo0 ()
end
function foo1()
return "a";
end
function foo2()
return "a","b";
end
x,y=foo2() =>x="a",y="b"
x=foo2() =>x="a","b"被舍弃
x,y,z=10,foo2() =>x=10,y="a",z="b";
x,y,z=foo2(),10 =>x="a",y=10,z=nil;
print(foo2()) =>a b
print(foo2() .. "x") =>ax
4.table可以完整的接受一个函数的所有返回值,但是条件同上
5.return 也可以返回完整的返回时,条件同上
6.存在一个特殊的函数【unpack】,可以完整的返回所有参数,且只受3规则控制,但是参数需要是数组
如
f=string.find;
a={"hello","ll"};
f(unpack(a)) =>3 4;
(ps,string.find函数用于查询字符串a中字符串b的起始位置和结束位置,string.find(a,b));
变长参数
Lua中可以将一个不定长的数组作为形参
function add(...)
local s=0
for i,v ipairs{...} do
s=s+v;
end
return s
end
甚至可以
function all(...)
return ...;
end
同时Lua提供了专门格式化文本和输出文本男的函数
function fwrite(fmt,...)
return io.write(string.format(fmt,...));
end
需要注意的是,fmt是固定参数,且可以拥有无数个,但是必须放在变长参数之前
fwrite() =>fmt=nil,没有变长参数
fwrite(“a”) =>fmt="a",没有变长参数
fwrite(“%d%d”,4,5) =>fmt="%d%d",变长参数为4和5;
但是变长参数中可能会存在nil值,这是需要函数【select】来操作变长参数;
如
select("#",...)返回的是变长参数的总数
select(n,...)返回的是变长参数的第n个参数
具名实参
Lua中可以通过指定形参的方式给形参赋值,
传一个table 作为参数,可以对指定的参数赋值,函数接受一个table作为形参,这样就可以对对应的参数进行操作赋值
同时这种模式的传值方式,可以设置某些参数为可选的,进而减少处理,已经可以不按照顺序传入,而是依照id对应