本文同步法表於個人網站
函數可以使用function
來做宣告,並以end
結束。
function hello()
print("Hello, World")
end
實際上這是Lua的語法糖,上面相當於:
hello = function()
print("Hello, World")
end
在Lua,函數是第一公民,是基本型別,可以榜定於變數,也可以作為參數傳遞,或是回傳
值。
function genFun()
return function()
print("Hello, World")
end
end
function callFun(f)
f()
end
local _f = genFun() -- # get a function
callFun(_f) -- print("Hello, World")
函數同時也是一個區塊,可以保有區域環境變數,這樣的特性可以用來做閉包。
關於閉包,我想會在中級議題: 閉包在更深入討論。
現在你只要知道函數內的區域變數,外部是無法存取的
function hello()
local name = "World"
print("Hello, " .. name)
end
hello() -- # Output => Hello, World
print("Hello, ", name) -- # => Hello, nil
-- out of hello, can't access local variable name of hello function
-- 離開了 hello函式,就無法存取內部的局部變數`name`
------------------------------------------
function genAddFun(k)
return function (n)
return k+n
end
end
add5 = genAddFun(5)
print(add5(5)) -- # => 10
Lua使用...
來處理不定長參數。
function hello(...)
local members = {...}
print("有多少成員: ", #members)
for _,m in pairs(members) do
print("Hello, "..m)
end
end
hello("Bob", "Lua", "Luna", "Selene")
...
只能是函數最後一個參數。在使用時,可以用{...}
來榜定一個參數作為命名使用。
當只有一個參數時,函數的使用有許多語法糖。總歸一句,當輸入是一個字面字串或是字面
表格時,不需要加上括號。
字面字串可以參考基礎1: 類型-字串。
function show(message)
print(message)
end
show "Hello"
----------------------
show [[
_oo0oo_
o8888888o
88" . "88
(| -_- |)
0\ = /0
___/`---'\___
.' \\| |// '.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' |_/ |
\ .-\__ '-' ___/-. /
___'. .' /--.--\ `. .'___
."" '< `.___\_<|>_/___.' >' "".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `_. \_ __\ /__ _/ .-` / /
=====`-.____`.___ \_____/___.-`___.-'=====
`=---='
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
佛祖保佑 永无BUG
]]
至於字面表格,會到基礎3: 複合結構 - table才提到,但簡單的示範如下:
function hello(members)
print("有多少成員: ", #members)
for _,m in pairs(members) do
print("Hello, "..m)
end
end
hello {"Bob", "Lua", "Luna", "Selene"}
是的,這樣的作法也可以當作不定長參數。
關於IIFE,可以參考:什麼是IIFE
和多數高階語言一樣,受到函式型語言影響,Lua的函式沒有名稱也可以執行:
(function ()
print("Hello, World")
end)()