В Lua, как передать vararg другой функции, а также взглянуть на них? - PullRequest
5 голосов
/ 02 мая 2010

Кажется, что в 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

Заметьте, что 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]: ?

Что я делаю не так? Разве я не должен объединять два? Почему нет?

Ответы [ 3 ]

10 голосов
/ 02 мая 2010

Использование 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

Вот что вы получите:

> 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
>
3 голосов
/ 02 мая 2010

Для количества аргументов вам нужно выбрать. Чтобы посмотреть на них, вы можете сделать это:

local first,second,third = ...
2 голосов
/ 02 мая 2010

Вы можете использовать select() для проверки ..., не прибегая к таблице arg:

firstarg  = select(1, ...)
secondarg = select(2, ...)

и т. Д.

Я не уверен, почему у вас возникают проблемы с их объединением - по моему опыту, их смешивание (и различные операции с ними) не было проблемой.

...