Lua函数之一

时间:2023-12-17 22:37:02

LUA函数之一

函数声明:

function foo(arguments)

  statements

end

1、函数调用

调用函数的时候,如果参数列表为空,必须使用()表明是函数调用,例如:

os.date()

当函数只有一个参数并且这个参数是字符串或者table构造器的时候,可以省略函数调用操作符"()",例如:

print "Hello World"

dofile "a.lua"

f{x=,y=}

面向对象方式调用函数的语法,例如:

obj::foo(x)
obj.foo(obj, x)

实参和形参结合时,多余部分被忽略,不足补充nil,例如:

function f(a,b) return a or b end

f()          -- a=3, b=nil
f(,)    -- a=3, b=4
f(,,)    -- a=3, b=4, 5 is discarded

2、多返回值

假设有3个函数:

function foo0() end
function foo1() return 'a' end
function foo2() return 'a', 'b' end

如果只想接收指定的返回值,可以使用哑元(dummy variable),例如:

_,x = foo2()
print(x)    -- 'b'

另一种方式是使用select函数:

select(index, ...),返回所有>=index的参数;当index='#',返回参数个数

function foo3() return 'a', 'b', 'c' end
print(select(, foo3())) -- a b c
print(select(, foo3())) -- a b
print(select(, foo3())) -- a
print(select('#', foo3())) --

在表达式中调用函数时:

1、当函数调用作为表达式最后一个参数(或仅有一个参数)时,函数尽可能多地返回多个值,不足补nil,超出舍去;

2、其他情况下,函数调用仅返回第一个值(如果没有返回值为nil);

x,y=foo2()            -- x='a',y='b'
x=foo2()     -- x='a', 'b' is discarded
x,y,z=,foo2()    -- x='10',y='a',z='b'
x,y=foo0()    --x=nil,y=nil
x,y=foo1()    -- x='a', y=nil
x,y,z=foo2()    -- x='a', y='b',z=nil x,y=foo2(),    --x='a',y=20
x,y=foo0(),,   -- x=nil,y=20, 30 is discarded
x,y,z=foo0(),foo2() -- x=nil,y='a',z='b'

函数调用在table构造器中使用时:

a = {foo0()}        -- a={}, a is empty
a = {foo2()} -- a={a,b}
a = {foo0(),foo1(),foo2(),} -- a={nil,a,a,b,4}

函数调用作为函数参数被使用时:

print (foo0())      --
print (foo1()) -- a
print (foo2()) -- a b
print (foo2() .. 'x') -- ax

可以使用圆括号"()"强制使调用只返回一个值:

print ((foo0()))      -- nil
print ((foo1())) -- a
print ((foo2())) -- a

unpack 函数接受一个数组作为输入参数,并返回数组的所有元素。

a={"england",,"china",, x="america"}
print(unpack(a)) -- england 960 china 30

上面的print函数可以打印可变参数。

2、可变参数

在Lua中,使用 ... 表示可变参数,在函数中可变参数会存放在arg的一个table中,它有一个域n表示参数个数。

function g(a,b,...)
result = ""
for i,v in ipairs(arg) do
result = result .. tostring(v) .. '\t'
end
result = result .. '\n'
end g() -- a=3, b=nil, arg={n=0}
g(,) -- a=3, b=4, arg={n=0}
g(,,,) -- a=3, b=4, arg={5,8,n=2}

如上面所示,Lua会将前面的实参传给固定参数,后面的实参放在arg表中。