В Lua, как передать vararg другой функции, также посмотрев на них?

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

Что я делаю неправильно? Разве я, как предполагается, не комбинирую два? Почему нет?

5
задан Roman Starkov 2 May 2010 в 12:49
поделиться

3 ответа

Использование 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
>
10
ответ дан 18 December 2019 в 11:54
поделиться

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

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

и так далее.

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

2
ответ дан 18 December 2019 в 11:54
поделиться

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

local first,second,third = ...
3
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: