小白學Lua 之Lua變長引數和unpack函式

2022-01-10 22:08:47 字數 2823 閱讀 4731

lua的變長引數和unpack函式在實際的開發中應用的還挺多的,比如在設計print函式的時候,需要支援對多個變數進行列印輸出,這時我們就需要用到lua中的變長引數和unpack函式了。

lua中支援可變引數,用 ... 表示。比如定義下面的這樣乙個函式:

local

function

func1(...)

end

當然它也支援在變長引數前面新增固定引數:

local

function

func1(var,...)

--dosomething

end

我們在使用變長引數的時候,首先需要將其獲取,然後再使用,**如下:

local

function

func(...)

local args = --

這裡的...和{}符號中間需要有空格號,否則會出錯

print (#args)

endfunc(

1,2,"

string

",4,5)

可以發現將變長引數用花括號進行打包以後,會得到乙個table,之後就跟我們平時應用lua沒什麼區別了。接著我們再來看看unpack函式,在lua裡面我們通常使用它來將陣列形式的table拆開。這個函式有三個引數,第乙個引數就是要拆的table,第二個引數是起始元素的下標,預設為1,第三個引數是結束元素的下標,預設為table的長度。函式原型如下:

舉個栗子,看看如何使用,由於其特性,unpack還可以作為尾呼叫來提供多個返回值:

local info=

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=

local a,b,c,d,e,f=unpack

(info)

print

(a,b,c,d,e,f)

輸出結果:12

3nil

5nil

我們都知道在lua中可以用print函式進行列印操作,它本身也支援傳遞變長引數,不過美中不足的就是它不支援列印table中的內容,比如下面的這段**:

print(1,2,3,)
執行上面的這段**,你通常會得到類似下面的這種輸出:

1

23 table: 00fe9950

可以看到table中的元素沒有被一一列印出來,因此我們可以利用lua的變長引數的功能來對print進行拓展,使他支援列印table中元素的內容:

1

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,"

print

",printext)

2728

print(1,2,3,,nil})

簡單說一下原理吧,先用區域性變數將lua原始的print函式儲存下來備用。然後分別定義printtable和printext函式。printtable使用遞迴的方式對錶中的元素進行遍歷及列印。printext會遍歷外部傳進來的多引數,然後根據型別進行分別處理。最後將全域性環境中的原生print函式覆蓋為我們自定義的printext。執行效果如下:

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...