Lua使用function定義函數,語法以下:數組
function function_name (arc) --arc表示參數列表,函數的參數列表能夠爲空函數
--body性能
endlua
上面的語法等價於:blog
function_name function_name (arc)字符串
--bodyit
end_io
上面的方法都是定義了一個全局函數,爲了避免污染命名空間,同時減小性能損耗,咱們應該儘可能使用「局部函數」,方法以下(只須要再前面加local聲明便可):table
local function function_name (arc) --arc表示參數列表,函數的參數列表能夠爲空function
--body
end
注意:Lua函數的本質是變量賦值,因此再使用函數以前,必定要先定義函數(C語言能夠再後面定義,前面聲明,可是Lua沒有聲明,只有定義)
因爲函數定義等價於變量賦值,也就能夠把函數名替換爲Lua某個表的字段,如:
function Foo.bar(a, b, c) --此時不能再加local函數聲明瞭 end
1)Lua函數的參數大部分是按值傳遞的。
函數傳參的幾個規則:
a、若參數個數大於形參個數,從左向右,多餘的實參被忽略
b、若實參個數小於形參個數,從左向右,沒有被初始化的形參被初始化爲nil
c、Lua還支持變長參數。用...表示。此時訪問參數也要用...,如:
local function func(...) --形參爲 ... ,表示函數採用變長參數 local temp = {...} --訪問的時候也要使用 ... local ans = table.concat(temp, "") --使用table.concat庫函數,對數組內容使用" "拼接成字符串。 print(ans) end func(1, 2) --傳遞了兩個參數 func(1, 2, 3, 4) --傳遞了四個參數 -->output 1 2 1 2 3 4
2)當函數參數是table類型時,傳遞進來的其實是實際參數的引用。如具名函數
Lua函數容許返回多個值,返回多個值時,中間用逗號隔開
函數返回值的規則:
1)若返回值個數大於接收變量的個數,多餘的返回值會被忽略掉;
2)若返回值個數小於參數個數,從左向右,沒有被返回值初始化的變量會被初始化爲nil
函數返回值與表達式:
1)當一個函數返回一個以上的返回值,且函數調用不是一個列表表達式的最後一個元素,那麼函數只返回第一個返回值,如:
local function init() --init函數返回兩個值 1和"lua" return 1, "lua" end local x, y, z = init(), 2 --init函數的位置不在最後,此時只返回 1 print(x, y, z) -->output 1 2 nil local a, b, c = 2, init() --init函數的位置在最後,此時返回 1 和 "lua" print(a, b, c) -->output 2 1 lua
2)若是你確保只取函數返回值的第一個值,可使用括號運算符,例如:
local function init() return 1, "lua" end print((init()), 2) -->output 1 2 print(2, (init())) -->output 2 1