1. 程式人生 > >Lua變長引數詳解

Lua變長引數詳解

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表示引數的個數;