function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" end-- 多重賦值的4種情況-- 第一種情況x, y = foo2() -- x = "a" , y = "b"x = foo2() -- x = "a"x, y, z = 10, foo2() -- x = 10, y = "a", z = "b"-- 第二種情況x, y = foo0() -- x = nil, y = nilx, y = foo1() -- x = "a", y = nilx, y, z = foo2() -- x = "a", y = "b", z = nil-- 第三種情況x, y = foo2(), 20 -- x = "a", y = 20x, y = foo0(), 20, 30 -- x = nil, y = 20-- 第四種情況print(foo0()) -- 不會打印任何值print(foo1()) -- aprint(foo2()) -- a, bprint(foo2(), 20) -- a, 1print(foo2() .. "x") -- ax
table 構造式
table 構造式可以完整地接收一個函數調用的所有結果,即不會有任何數量方面的調整
但這種行為,只有當一個函數調用作為最后一個元素時才會發生
其他位置上的函數調用總是只產生一個結果值
function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" endt = {foo2()} -- t = {"a", "b"}t = {foo2(), "x"} -- t = {"a", "x"}?
return
將函數調用放入一對圓括號 () 中,使其只返回一個結果
return 語句后面的內容不需要 () 圓括號
如果強行加上則會使一個多返回值的函數,強制其只返回一個 return(f())
function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" endfunction foo(i) ? ?if i == 0 then return foo0() ? ? ? ?elseif i == 1 then return foo1() ? ? ? ?elseif i == 2 then return foo2() endendprint(foo(1)) -- aprint(foo(2)) -- a, bprint(foo(0)) -- 無返回值?-- () 包裹print((foo(1)) -- aprint((foo(2)) -- aprint((foo(0)) -- nil 不太懂為什么
unpack 函數
接收一個數組作為參數
并從下標 1 開始返回該數組的所有元素
這個預定義函數由 C 語言編寫
print(unpack{10, 20, 30}) -- 10 20 30a, b = unpack{10, 20, 30} ?-- a = 10, b = 20
用于泛型調用
泛型調用就是可以以任何實參來調用任何函數
-- 調用任意函數 f, 而所有的參數都在數組 a 中-- unpack 將返回 a 中的所有值,這些值作為 f 的實參f(unpack(a)) f = string.finda = {"hello", "ll"}f(unpack(a)) -- 3 4 等效于 string.find("hello", "ll")
用 lua 遞歸實現 unpack
function unpack(t, i) ? ?i = i or 1 ? ?if t[i] then ? ? ? ?return t[i], unpack(t, i + 1) ? ?endend
變長參數
lua 中的函數可以接收不同數量的實參
當這個函數被調用時,它的所有參數都會被收集到一起
這部分收集起來的實參稱為這個函數的「變長參數」
... 3個點表示該函數接收不同數量的實參
一個函數要訪問它的變長參數時,需要用 ... 三個點,此時 ... 三個點是作為一個表達式使用的
表達式 ... 三個點的行為類似一個具有多重返回值的函數,它返回的是當前函數的所有變長參數
具有變長參數的函數也可以擁有任意數量的固定參數
但固定參數一定要在變長參數之前
當變長參數中包含 nil ,則需要用 select 訪問變長參數
調用 select 時,必須傳入一個固定參數 selector(選擇開關) 和一系列變長參數
如果 selector 為數字 n ,那么 select 返回它的第 n 個可變實參
否則,select 只能為字符串 "#" ,這樣 select 會返回變長參數的總數,包括 nil
-- 返回所有參數的和function add(...) local s = 0 ? ?for i, v in ipairs{...} do -- 表達式{...}表示一個由變長參數構成的數組 ? ? ? s = s + v ? ?end ? ?return sendprint(add(3, 4, 5, 100)) -- 115?-- 調試技巧 ,類似與直接調用函數 foo ,但在調用 foo 前先調用 print 打印其所有的實參function foo1(...) ? ?print("calling foo:", ...) ? ?return foo(...)end??-- 獲取函數的實參列表function foo(a, b, c) endfunction foo(...) ? ? ? ?local a, b, c = ...end-- 格式化文本 string.format ,輸出文本 io.write-- 固定參數一定要在變長參數之前function fwrite(fmt, ...) ? ?return io.write(string.format(fmt, ...))endfwrite() -- fmt = nilfwrite("a") -- fmt = a fwrite("%d%d", 4, 5) -- fmt = "%d%d" , 變長參數 = 4, 5?for i = 1, select('#', ...) do ? ?local arg = select('#', ...) ? end