lua的變長引數和unpack函式在實際的開發中應用的還挺多的,比如在設計print函式的時候,需要支援對多個變數進行列印輸出,這時我們就需要用到lua中的變長引數和unpack函式了。
lua中支援可變引數,用 ... 表示。比如定義下面的這樣乙個函式:
local當然它也支援在變長引數前面新增固定引數:function
func1(...)
end
local我們在使用變長引數的時候,首先需要將其獲取,然後再使用,**如下:function
func1(var,...)
--dosomething
end
local可以發現將變長引數用花括號進行打包以後,會得到乙個table,之後就跟我們平時應用lua沒什麼區別了。接著我們再來看看unpack函式,在lua裡面我們通常使用它來將陣列形式的table拆開。這個函式有三個引數,第乙個引數就是要拆的table,第二個引數是起始元素的下標,預設為1,第三個引數是結束元素的下標,預設為table的長度。函式原型如下:function
func(...)
local args = --
這裡的...和{}符號中間需要有空格號,否則會出錯
print (#args)
endfunc(
1,2,"
string
",4,5)
舉個栗子,看看如何使用,由於其特性,unpack還可以作為尾呼叫來提供多個返回值:
local info=需要注意的一點是,如果遇到陣列下有nil,或者有字母key的時候,unpack將會返回nil,**如下:local a,b,c,d,e,f = unpack
(info)
(a,b,c,d,e,f)
--輸出結果:1 2 3 4 5 6
local
function
func1 (t)
return
unpack
(t)end
local v1,v2,v3,v4,v5,v6 =func1(info)
print(v1,v2,v3,v4,v5,v6)
local info=我們都知道在lua中可以用print函式進行列印操作,它本身也支援傳遞變長引數,不過美中不足的就是它不支援列印table中的內容,比如下面的這段**:local a,b,c,d,e,f=unpack
(info)
(a,b,c,d,e,f)
輸出結果:12
3nil
5nil
print(1,2,3,)執行上面的這段**,你通常會得到類似下面的這種輸出:
1可以看到table中的元素沒有被一一列印出來,因此我們可以利用lua的變長引數的功能來對print進行拓展,使他支援列印table中元素的內容:23 table: 00fe9950
1簡單說一下原理吧,先用區域性變數將lua原始的print函式儲存下來備用。然後分別定義printtable和printext函式。printtable使用遞迴的方式對錶中的元素進行遍歷及列印。printext會遍歷外部傳進來的多引數,然後根據型別進行分別處理。最後將全域性環境中的原生print函式覆蓋為我們自定義的printext。執行效果如下:local raw_print = print23
local
function
printtable(t)4if
type(t) == "
table
"then
5for _,v in
pairs(t) do6if
type(v) == "
table
"then
7printtable(v)
8else
9raw_print(v)
10end
11end
12end
13end
1415
local
function
printext(...)
16local args =
17for _,v in
pairs(args) do
18if
type(v) == "
table
"then
19printtable(v)
20else
21raw_print(v)
22end
23end
24end
2526
rawset(_g,"
",printext)
2728
print(1,2,3,,nil})
123四、總結123456
abc
在本篇部落格中,馬三同大家一起了解了lua中變長引數和unpack函式的使用,並且通過拓展原生print函式的例項進行了練習。
小白學Lua 之Lua變長引數和unpack函式
lua的變長引數和unpack函式在實際的開發中應用的還挺多的,比如在設計print函式的時候,需要支援對多個變數進行列印輸出,這時我們就需要用到lua中的變長引數和unpack函式了。lua中支援可變引數,用 表示。比如定義下面的這樣乙個函式 local function func1 end當然它...
lua 可變長引數
lua 中 在引數列表中意為 可變引數 這個可變是指,通過這個可以輸入很多引數,但是不需要一一枚舉出來!例子 function a local a1 a2,a3,a4 print this is local num a1,a2,a3,a4 return a1,a2,a3,a4 endlocal at...
Lua(八)引數的簡化 可變引數(變長引數)
引數的簡化 概念 函式若只有乙個引數,並且此引數是乙個字串或者table構造式,則 實參 圓括號可以省略。function testfunction str print testfunction str endtestfunction aaa testfunction aaa testfunctio...