【小白學Lua】之Lua變長參數和unpack函數

1、簡介

  Lua的變長參數和unpack函數在實際的開發中應用的還挺多的,好比在設計print函數的時候,須要支持對多個變量進行打印輸出,這時咱們就須要用到Lua中的變長參數和unpack函數了。html

2、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的長度。函數原型以下:lua

  舉個栗子,看看如何使用,因爲其特性,unpack還能夠做爲尾調用來提供多個返回值:spa

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

3、小實例---拓展print函數

  咱們都知道在lua中能夠用print函數進行打印操做,它自己也支持傳遞變長參數,不過美中不足的就是它不支持打印table中的內容,好比下面的這段代碼:code

print(1,2,3,{123,456})

  運行上面的這段代碼,你一般會獲得相似下面的這種輸出:htm

1       2       3       table: 00FE9950

  能夠看到table中的元素沒有被一一打印出來,所以咱們能夠利用lua的變長參數的功能來對print進行拓展,使他支持打印table中元素的內容:blog

 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

4、總結

  在本篇博客中,馬三同你們一塊兒瞭解了Lua中變長參數和unpack函數的使用,而且經過拓展原生print函數的實例進行了練習。

 

 

若是以爲本篇博客對您有幫助,能夠掃碼小小地鼓勵下馬三,馬三會寫出更多的好文章,支持微信和支付寶喲!

       

 

做者:馬三小夥兒
出處:http://www.javashuo.com/article/p-fydkqtcg-bo.html  請尊重別人的勞動成果,讓分享成爲一種美德,歡迎轉載。另外,文章在表述和代碼方面若有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!

相關文章
相關標籤/搜索