Lua變長引數詳解
阿新 • • 發佈:2019-02-04
Lua變長引數:
Lua支援變長引數,使用簡單(藉助於table、多重賦值), Lua中的函式還可以接受不同數量的實參。例如:在呼叫print時可以傳入一個、兩個或多個實參。引數中的三個點(...)表示該函式可接受不同數量的實參。當這個函式被呼叫時,它的所有引數都會被收集到一起,這部分收集起來的實參稱為這個函式的“變長引數”。 一個函式要訪問他的變長引數時,仍需要用到3個點(...),只是此時的3個點作為一個表示式來使用的(如上)。表示式“...”的行為類似於一個具有多重返回值的函式,它返回的是當前函式的所有變長引數。
示例程式碼1如下:
function add(...) local s = 0 for i, v in ipairs{...} do --> {...} 表示一個由所有變長引數構成的陣列 s = s + v end return s end print(add(3,4,5,6,7)) --->25
程式碼示例2:
function fwrite(fmt, ...) --->3點之前有個固定的引數fmt。具有變長引數的函式同樣也可以用擁有任意數量的固定引數,但是固定引數必須放在變長引數之前。 lua會將前面的實參賦予固定引數,而將餘下的實參(如果有的話)視為變長引數。 return io.write(string.format(fmt, ...)) end fwrite() --->fmt = nil,沒有變長引數。 fwrite("a") --->fmt = "a",沒有變長引數。 fwrite("%d%d", 4, 5) ---->fmt = "%d%d",變長引數= 4 和 5
程式碼示例3如下:
function f(...)
for k,v in ipairs({...}) do
print(k,v)
end
end
f(2,3,3)
1 2
2 3
3 3
使用多重賦值的方式
程式碼如下:
function sum3(...)
a,b,c = ...
a = a or 0
b = b or 0
c = c or 0
return a + b +c
end
=sum3(1,2,3,4)
6
return sum3(1,2)
3
通常在遍歷變長引數的時候只需要使用{…},然而變長引數可能會包含一些nil;那麼就可以用select函式來訪問變長引數了:select('#', …)或者 select(n, …)
select('#', …)返回可變引數的長度,select(n,…)用於訪問n到select('#',…)的引數
程式碼如下:
=select('#', 1,2,3)
3
return select('#', 1,2, nil,3)
4
=select(3, 1,2, nil,3)
nil 3
=select(2, 1,2, nil,3)
2 nil 3
注意:Lua5.0中沒有提供…表示式,而是通過一個隱含的區域性table變數arg來接收所有的變長引數,arg.n表示引數的個數;