Lua 使用關(guān)鍵字 function 定義函數(shù),語法如下:
function function_name (arc) -- arc 表示參數(shù)列表,函數(shù)的參數(shù)列表可以為空
-- body
end
上面的語法定義了一個全局函數(shù),名為 function_name
. 全局函數(shù)本質(zhì)上就是函數(shù)類型的值賦給了一個全局變量,即上面的語法等價于
function_name = function (arc)
-- body
end
由于全局變量一般會污染全局名字空間,同時也有性能損耗(即查詢?nèi)汁h(huán)境表的開銷),因此我們應(yīng)當(dāng)盡量使用“局部函數(shù)”,其記法是類似的,只是開頭加上 local
修飾符:
local function function_name (arc)
-- body
end
由于函數(shù)定義本質(zhì)上就是變量賦值,而變量的定義總是應(yīng)放置在變量使用之前,所以函數(shù)的定義也需要放置在函數(shù)調(diào)用之前。
示例代碼:
local function max(a, b) --定義函數(shù) max,用來求兩個數(shù)的最大值,并返回
local temp = nil --使用局部變量 temp,保存最大值
if(a > b) then
temp = a
else
temp = b
end
return temp --返回最大值
end
local m = max(-12, 20) --調(diào)用函數(shù) max,找去 -12 和 20 中的最大值
print(m) --> output 20
如果參數(shù)列表為空,必須使用 ()
表明是函數(shù)調(diào)用。
示例代碼:
local function func() --形參為空
print("no parameter")
end
func() --函數(shù)調(diào)用,圓擴(kuò)號不能省
--> output:
no parameter
在定義函數(shù)要注意幾點(diǎn):
由于函數(shù)定義等價于變量賦值,我們也可以把函數(shù)名替換為某個 Lua 表的某個字段,例如
function foo.bar(a, b, c)
-- body ...
end
此時我們是把一個函數(shù)類型的值賦給了 foo
表的 bar
字段。換言之,上面的定義等價于
foo.bar = function (a, b, c)
print(a, b, c)
end
對于此種形式的函數(shù)定義,不能再使用 local
修飾符了,因?yàn)椴淮嬖诙x新的局部變量了。