一、簡介
Lua的變長參數和unpack函數在實際的開發中應用的還挺多的,比如在設計print函數的時候,需要支持對多個變量進行打印輸出,這時我們就需要用到Lua中的變長參數和unpack函數了。
二、Lua變長參數與unpack函數
Lua中支持可變參數,用 ... 表示。比如定義下面的這樣一個函數:
local function func1(...) end
當然它也支持在變長參數前面添加固定參數:
local function func1(var,...) --dosomething end
我們在使用變長參數的時候,首先需要將其獲取,然后再使用,代碼如下:
local function func(...) local args = { ... } --這里的...和{}符號中間需要有空格號,否則會出錯 print (#args) end func(1,2,"string",4,5)
可以發現將變長參數用花括號進行打包以后,會得到一個table,之后就跟我們平時應用Lua沒什么區別了。接着我們再來看看unpack函數,在Lua里面我們通常使用它來將數組形式的table拆開。這個函數有三個參數,第一個參數就是要拆的table,第二個參數是起始元素的下標,默認為1,第三個參數是結束元素的下標,默認為table的長度。函數原型如下:

舉個栗子,看看如何使用,由於其特性,unpack還可以作為尾調用來提供多個返回值:
local info={1,2,3,4,5,6} local a,b,c,d,e,f = unpack(info) print(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)
需要注意的一點是,如果遇到數組下有nil,或者有字母key的時候,unpack將會返回nil,代碼如下:
local info={1,2,3,nil,5,p=6} local a,b,c,d,e,f=unpack(info) print(a,b,c,d,e,f) 輸出結果:1 2 3 nil 5 nil
三、小實例---拓展print函數
我們都知道在lua中可以用print函數進行打印操作,它本身也支持傳遞變長參數,不過美中不足的就是它不支持打印table中的內容,比如下面的這段代碼:
print(1,2,3,{123,456})
運行上面的這段代碼,你通常會得到類似下面的這種輸出:
1 2 3 table: 00FE9950
可以看到table中的元素沒有被一一打印出來,因此我們可以利用lua的變長參數的功能來對print進行拓展,使他支持打印table中元素的內容:
1 local raw_print = print 2 3 local function printTable(t) 4 if type(t) == "table" then 5 for _,v in pairs(t) do 6 if type(v) == "table" then 7 printTable(v) 8 else 9 raw_print(v) 10 end 11 end 12 end 13 end 14 15 local function printExt(...) 16 local args = { ... } 17 for _,v in pairs(args) do 18 if type(v) == "table" then 19 printTable(v) 20 else 21 raw_print(v) 22 end 23 end 24 end 25 26 rawset(_G,"print",printExt) 27 28 print(1,2,3,{123,456,{"abc"},nil})
簡單說一下原理吧,先用局部變量將lua原始的print函數保存下來備用。然后分別定義printTable和printExt函數。printTable使用遞歸的方式對表中的元素進行遍歷及打印。printExt會遍歷外部傳進來的多參數,然后根據類型進行分別處理。最后將全局環境中的原生print函數覆蓋為我們自定義的printExt。運行效果如下:
1 2 3 123 456 abc
四、總結
在本篇博客中,馬三同大家一起了解了Lua中變長參數和unpack函數的使用,並且通過拓展原生print函數的實例進行了練習。
如果覺得本篇博客對您有幫助,可以掃碼小小地鼓勵下馬三,馬三會寫出更多的好文章,支持微信和支付寶喲!

作者:馬三小伙兒
出處:https://www.cnblogs.com/msxh/p/10054070.html
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!
