lua函数在调用时,必须将所有参数放在一对圆括号中,即使没有参数。但是如果参数只有一个,而且参数是一个字面字符串或者table构造式,那么圆括号就可有可无。
e.g.
print"hello girl" ---> print("hello girl")
print'hello boy' ----> print('hello boy')
print[[hello beautiful girl]] -->print([[hello beautiful girl]])
f{1,3} -----> print({1,3})
在面对对象中,函数调用有两张方式:1, o.f(o,x),o为调用函数的对象。2, o:(x), 其中隐含了将调用函数的对象作为第一个参数。
对于函数的形参和实参的匹配问题,遵循一条原则,实参多余形参,实参舍去,实参不足,形参初始化为nil.
multible results:多重返回值 :一个函数可以返回多个值
当一个函数需要返回多个值时,只需要return 后面列出所有的返回值即可。
e.g. --返回数组中最大的值和他的位置
function maximum(a)
local pos = 1
local max = a[pos]
for i,val in ipairs(a) do
if val > max then
max = val
pos = i
end
end
return max, pos
end
print(maximum{3,12,4,55})
当将具有多重返回值的函数作为表达式的一部分调用时,lua默认只保留函数的一个返回值。只有当一个函数调用是一系列表达式的最后一个元素或者仅有一个元素时,才会返回所有值。这里的特殊情况包括4种:多重赋值,函数调用时传入的实参列表,table构造式,return语句
多重赋值:
function f0() end
function f1() return 'a' end
function f2() return 'a','b' end
x, y = f2() -- x = 'a', y= 'b'
x,y = 10,f2() -- x = 10, y= 'a
函数调用时传入的实参列表
pirnt(f2()) -- a b
print(f2()..'c') -- ac
print(x..f2()) -- xa b
table构造式
a = {f2()} -- a = {'a','b'}
a = {3,f2()} -- a = {3,‘a’,'b'}
a = {f2(),3} --- a= {'a', 3}
return 语句 return f()这样的写法将返回f()的所有值
function f(i)
if i==0 then return foo()
elseif i ==1 then return foo1()
elseif i==2 then return foo2()
end
end
print(f(0))
piint(f(1))
print(f(2))
但是,如何将一个函数调用放在一个函数中,即强制返回一个值
pirnt((f(2))) -----a
此外,这里特别介绍一个函数,unpack(),接受一个数组作为参数,从下标1开始返回数组的所有元素
print(unpack{1,3,4}) ----- 1 3 4
unpack()主要用于泛型调用(generic call), 泛型调用机制可以动态的以任何实参来调用任何函数。
unpack()虽然是用c语言写的,但是也可以用lua递归实现
function unpack(arr,i)
i = i or 1
if arr[i] then
return arr[i], unpack(arr, i+1)
end
end