Lua中的函數還能夠接受不一樣數量的實參。例如:在調用print時能夠傳入一個、兩個或多個實參。數組
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
參數中的三個點(...)表示該函數可接受不一樣數量的實參。當這個函數被調用時,它的全部參數都會被收集到一塊兒,這部分收集起來的實參稱爲這個函數的「變長參數」。函數
一個函數要訪問他的變長參數時,仍須要用到3個點(...),只是此時的3個點做爲一個表達式來使用的(如上)。表達式「...」的行爲相似於一個具備多重返回值的函數,它返回的是當前函數的全部變長參數。lua
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
一般一個函數在遍歷其變長參數時只須要使用表達式{...},這就像訪問一個table同樣,訪問全部的變長參數。spa
函數select用於訪問變長函數中有nil值的狀況:code
調用select時,必須傳入一個固定的實參selector和一系列變長參數。若是selector爲數字n,那麼select返回它的第n個可變實參;不然selector只能爲字符串「#」,這樣select會返回變長參數的總數。orm
for i =1 ,select("#", ...) do local arg = select(i, ...) --->獲得第i個變長參數對應的可變實參。 <循環體> end