1.簡單的例子
lua中的函數和c中的很相似,下面是數組累加的例子:
nums={3,321,11,23,32}function add(a)local sum=0for k,v in ipairs(a) dosum=sum+vendreturn sumendprint(add(nums))
2.返回多個值
lua中的函數可以有多個傳回值,下面的例子就找到最大值和它的位置。
function maximum (a)local mi = 1-- index of the maximum valuelocal m = a[mi]-- maximum valuefor i,val in ipairs(a) doif val > m thenmi = i; m = valendendreturn m, miendprint(maximum({8,10,23,12,5}))
可以利用這樣的函數一次性給多個變數賦值,如果變數的個數多餘函數的傳回值個數,那麼多餘變數就賦值為nil,如果利用返回多個值的函數給某一個變數賦值的時候,只把函數返回的第一個值賦給變數。
還是接著上面的例子;
a,b,c=maximum({8,10,23,12,5})d=maximum({8,10,23,12,5})print(a,b,c,d);
運行結果是這樣:
當利用沒有傳回值的函數對變數進行賦值的時候,就將nil賦給該變數。
當函數調用出現在一個運算式中的時候,函數只返回第一個傳回值。
當用函數來構造table的時候,所有傳回值都會用到。
例如
e={maximum({8,10,23,12,5})}print(e[1],e[2])
可以在函數調用的時候加上一對()來確保傳回值只有一個。
總之,lua會根據情況調節函數的傳回值。
3.接受可變參數的函數
函授接受的參數個數可以是變化的,比如說遍曆數組,在c中需要傳遞數組的指標和數組的大小,在lua中用...就可以了。
function add (...)local s=0for i,v in ipairs{...} dos=s+vendreturn sendprint(add(321,32,1,34,12))
這樣就可以遍曆數組求和了。
4.具名引數
有時候你並不一定知道函數參數的順序,這時候使用具名引數就有很大作用了。
function sub(arg)return (arg.first-arg.second)endprint(sub{first=12,second=2})