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
 
 
 
 
posted @   EdisoNewton  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示