Lua 中的可变长函数
Lua中的可变长函数的参数用 ... 来表示 ( 3个 . )
在函数内部有一个特殊的内置变量 arg
其格式如下
arg =
{
1,
"Hello",
true,
n = 3
}
1 -- function makeVarStr(...) to see print_Table.lua 2 3 function printMultiArg(...) 4 print("... = " .. makeVarStr(arg)) 5 end 6 7 8 function my_print1(fmt, ... ) 9 print("=================== Begin my_print1 ===================") 10 print("fmt = " .. makeVarStr(fmt)) 11 12 13 print("... = " .. makeVarStr(arg)) 14 print("=================== End my_print1 ===================\n") 15 end 16 17 function my_print2(fmt, ... ) 18 print("=================== Begin my_print2 ===================") 19 print("fmt = " .. makeVarStr(fmt)) 20 21 printMultiArg(arg) 22 print("=================== End my_print2 ===================\n") 23 end 24 25 function my_print3(fmt, ... ) 26 print("=================== Begin my_print3 ===================") 27 print("fmt = " .. makeVarStr(fmt)) 28 29 printMultiArg(...) 30 print("=================== End my_print3 ===================\n") 31 end 32 33 34 35 a =1 36 b = "Hello" 37 c = true 38 my_print1("a = ??? , b = ??? , c= ??? ",a,b,c) 39 my_print2("a = ??? , b = ??? , c= ??? ",a,b,c) 40 my_print3("a = ??? , b = ??? , c= ??? ",a,b,c) 41 42 --[[ 43 =================== Begin my_print1 =================== 44 fmt = "a = ??? , b = ??? , c= ??? " 45 ... = 46 { 47 [1] = 1, 48 [2] = "Hello", 49 [3] = true, 50 "n" = 3, 51 } 52 =================== End my_print1 =================== 53 54 =================== Begin my_print2 =================== 55 fmt = "a = ??? , b = ??? , c= ??? " 56 ... = 57 { 58 [1] = 59 { 60 [1] = 1, 61 [2] = "Hello", 62 [3] = true, 63 "n" = 3, 64 }, 65 "n" = 1, 66 } 67 =================== End my_print2 =================== 68 69 =================== Begin my_print3 =================== 70 fmt = "a = ??? , b = ??? , c= ??? " 71 ... = 72 { 73 [1] = 1, 74 [2] = "Hello", 75 [3] = true, 76 "n" = 3, 77 } 78 =================== End my_print3 =================== 79 80 81 ]]
##############################
Nice Version 1
Use select(n, ...) expression
##############################
1 --[[ 2 ////////////////////////////////////////////////////////////////////////////////////////////////////// 3 // Lua Interpret will assignment 4 // The command line arguments as the internal build-in argument named "arg" 5 // instead of "..." in the function argument list 6 // 7 // Variadic Arguments 8 // 9 // 10 ////////////////////////////////////////////////////////////////////////////////////////////////////// 11 --]] 12 13 function printAll(fmt, ...) 14 print("---------- Begin printAll() ----------\n") 15 print("fmt = " .. fmt) 16 print("arg = " , ... ) 17 print() 18 19 -- 20 -- yield the argument list's Count 21 -- 22 print("# ... = ", select("#", ...) ) 23 24 print("******************************") 25 for i=1,select("#", ...) do 26 -- Here : ( ) is a must 27 -- ******************************************************************************************************************** 28 -- ( ) ==> force "select(...)" function return only one argument rathan than multiple arguments 29 -- ******************************************************************************************************************** 30 print(" ",i," = ", (select(i, ...)) ) 31 end 32 print("******************************\n") 33 34 print("---------- End printAll() ----------") 35 end 36 37 38 printAll("Hello-World : ", "a1", "b2", "c3" , 3.14, true, false, nil , "end");
---------- Begin printAll() ----------
fmt = Hello-World :
arg = a1 b2 c3 3.14 true false nil end
# ... = 8
******************************
1 = a1
2 = b2
3 = c3
4 = 3.14
5 = true
6 = false
7 = nil
8 = end
******************************
---------- End printAll() ----------
####################################
Nice Version 2
Use 'arg' internal varible
instead of '...' <= Variadic arguments
###################################
1 print("--------------------------------------------------") 2 print("outside arg = ",arg) 3 print("outside arg.n = ",arg.n) 4 print("--------------------------------------------------\n") 5 6 7 local newgt = { 8 printAll = function(fmt, ...) 9 print("fmt = ",fmt) 10 print("inner arg = ", arg) 11 print("inner arg.n = ", arg.n) 12 13 for i,v in pairs(arg) do 14 print("\t",i,v) 15 end 16 return "Done" 17 end 18 19 } 20 setmetatable(newgt, { __index = _G }) 21 22 -- setfenv(...) is avaliable only in lua5.1 23 setfenv(1, newgt) 24 25 26 27 print(" [1] [2] [3] [4] [5] [6] [7]") 28 print("Calling " .. [[printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false)]]) 29 print( printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false) )
--------------------------------------------------
outside arg = table: 00B302A0
outside arg.n = nil
--------------------------------------------------
[1] [2] [3] [4] [5] [6] [7]
Calling printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false)
fmt = format : %d%c
inner arg = table: 00B30138
inner arg.n = 7
1 a1
2 b2
3 c3
4 3.14
5 true
7 false
n 7
Done
分类:
Lua
, Lua / Variadic_Arguments
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)