Lua 變長引數以及 printf 實現

2021-09-25 13:12:40 字數 1473 閱讀 2524

lua 變長引數

lua 中的函式可以接受不同數量的實參。例如:在呼叫print時可以傳入乙個、兩個或多個實參。形參中的三個點(…)表示該函式可接受不同數量的實參。當這個函式被呼叫時,它的所有引數都會被收集到一起,這部分收集起來的實參稱為這個函式的「變長引數」。 乙個函式要訪問他的變長引數時,仍需要用到 「…」,只是此時的 「…」 是作為乙個表示式來使用的,其行為類似於乙個具有多重返回值的函式,它返回的是當前函式的所有變長引數。如下所示:

function add(.

..) local s =0--

表示乙個由所有變長引數構成的陣列,

必須要有,

()可以不寫

for i, v in ipairs()

do s = s + v

endreturn s

endprint

(add(3

,4,5

,6,7

))---

>

25function test(.

..)-- 把可變引數放在錶類

local args =

print

(#args)

endprint

(test(1

,2,3

))---

>

3

有點類似 c++ 的變長引數模版,lua 變長引數中的也可以與固定引數一起使用,比如經典的 printf 就是這麼實現的(printf(const char *format, …);),lua 中沒有 printf,但是可以用 io.write 和變長引數來實現,如下所示:

printf =

function

(str,..

.)return io.

write

(str:

format(.

..))

endprintf

("%s\n"

,"hello world!")--

-> hello world!

這是因為string.format() 的引數也是可變引數,其原型為 string.format (formatstring, ···)。第乙個引數為字串格式,後面的引數可以任意多個,用於填充第乙個引數中的格式控制符,最後返回完整的格式化後的字串。

格式控制符以%開頭,常用的有以下幾種:

str = string.

format

("字串:%s, 整數:%d, 小數:%f, 十六進製制數:%x"

,"abcd"

,123

,0.1415926

,123

)print

(str)---

> 字串:abcd, 整數:123

, 小數:0.141593

, 十六進製制數:7b

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

可變引數函式 以printf為例子

void foo int argv1,char argv2,在參數列的末尾給出省略號,表明這個函式的引數是可變的 程序在呼叫函式時,會將函式引數壓入使用者棧,壓入的順序是從參數列右端開始,從右至左的壓棧順序支援了可變引數的實現。左邊的引數在低位址,右邊的引數在高位址。進入函式後,以左邊的引數為線索,...

Lua(八)引數的簡化 可變引數(變長引數)

引數的簡化 概念 函式若只有乙個引數,並且此引數是乙個字串或者table構造式,則 實參 圓括號可以省略。function testfunction str print testfunction str endtestfunction aaa testfunction aaa testfunctio...