在Lua中,如何将vararg传递给另一个函数,同时还要看一眼它们?

Rom*_*kov 5 lua variadic-functions

似乎在Lua中,我可以将vararg传递给另一个函数,或者通过它们看一眼arg,但不是两者.这是一个例子:

function a(marker, ...)
  print(marker)
  print(#arg, arg[1],arg[2])
end

function b(marker, ...)
  print(marker)
  destination("--2--", ...)
end

function c(marker, ...)
  print(marker)
  print(#arg, arg[1],arg[2])
  destination("--3--", ...)
end


function destination(marker, ...)
  print(marker)
  print(#arg, arg[1],arg[2])
end
Run Code Online (Sandbox Code Playgroud)

观察到a只看varargs,b只传递它们,而c两者都是.结果如下:

>> a("--1--", "abc", "def")
--1--
2   abc def


>> b("--1--", "abc", "def")
--1--
--2--
2   abc def


>> c("--1--", "abc", "def")
--1--
test.lua:13: attempt to get length of local 'arg' (a nil value)
stack traceback:
    ...test.lua:13: in function 'c'
    ...test.lua:22: in main chunk
    [C]: ?
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我不应该把两者结合起来吗?为什么不?

Dou*_*rie 10

使用的arg是过时了.试试这个:

function a(marker, ...)
  print(marker)
  print(select('#',...), select(1,...), select(2,...))
end

function b(marker, ...)
  print(marker)
  destination("--2--", ...)
end

function c(marker, ...)
  print(marker)
  print(select('#',...), select(1,...), select(2,...))
  destination("--3--", ...)
end

function destination(marker, ...)
  print(marker)
  print(select('#',...), select(1,...), select(2,...))
end
Run Code Online (Sandbox Code Playgroud)

这是你得到的:

> a("--1--", "abc", "def")
--1--
2   abc def
> b("--1--", "abc", "def")
--1--
--2--
2   abc def
> c("--1--", "abc", "def")
--1--
2   abc def
--3--
2   abc def
>
Run Code Online (Sandbox Code Playgroud)

  • @daurnimator,你是连接,select(N,...)返回以参数N开头的所有值.这只对传递给print的最后一个参数很重要."如果在另一个表达式中或在表达式列表的中间使用vararg表达式,则将其返回列表调整为一个元素.如果表达式用作表达式列表的最后一个元素,则不进行任何调整(除非最后一个表达式括在括号中)." 在这种情况下,它无关紧要(打印调用中的最后一个参数恰好只传递一个值,因为它是...的最后一个). (3认同)
  • `print(选择('#',...),选择(1,...),选择(2,...))`你的想法不起作用.选择只是切断前n个参数,剩下的就在那里:这实际上与`print(select('#',...),...)`相同.您可以将每个参数包装在括号中; 或使用数组:函数a(m,...)local arg = {n = select("#",...),...} print(arg.n,arg [1],arg [2] ) 结束 (2认同)