首页 > 代码库 > Lua函数之一

Lua函数之一

函数声明:

function foo(arguments)

  statements

end

 

1、函数调用

 

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

os.date()

 

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

print "Hello World"

dofile "a.lua"

f{x=10,y=20}

 

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

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

 

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

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

f(3)          -- a=3, b=nil
f(3,4)        -- a=3, b=4
f(3,4,5)      -- 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(1, foo3()))    -- a b c
print(select(2, foo3()))    -- a b
print(select(3, foo3()))    -- a
print(select(‘#‘, foo3()))  -- 3

 

在表达式中调用函数时:

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

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

技术分享
x,y=foo2()            -- x=‘a‘,y=‘b‘
x=foo2()              -- x=‘a‘, ‘b‘ is discarded
x,y,z=10,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(),20          --x=‘a‘,y=20 
x,y=foo0(),20,30        -- 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(),4}        -- 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",960,"china",30, 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(3)             -- a=3, b=nil, arg={n=0}
g(3,4)           -- a=3, b=4, arg={n=0}
g(3,4,5,8)       -- a=3, b=4, arg={5,8,n=2}
技术分享

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

  

Lua函数之一