Что идиоматический путь состоит в том, чтобы обращаться с ценностями variadic в переменном назначении?

У меня есть некоторый код, который хочет сделать, захватывают некоторые дополнительные возвращаемые значения от функции и передают их вперед последний на:

local ok, ... = coroutine.resume(co)
do_stuff(ok)
return ...

Однако это не будет бежать, начиная с ... на переменном назначении синтаксическая ошибка.

Я мог работать вокруг этого ограничения при помощи старых "аргументов функций, и переменные - эквивалентная" уловка и немедленно призванная функция

return (function(ok, ...)
    do_stuff(ok)
    return ...
)(coroutine.resume(co))

но я предполагаю делать, так не было бы очень идиоматично или эффективен. Там более разумные пути состоят в том, чтобы решить эту проблему обработки остающихся ценностей, возвращенных из резюме требование?

Править: Между прочим, это должно работать с ноль ценности в дополнительных аргументах

EDIT2: Looks like using the immediately invoked function was the best way all along.

5
nl ja de
Прохождение через функцию будет более эффективным, чем составление таблицы, чтобы временно держать ценности. Однако, если you' ре коснулось эффективностью, необходимо определить функцию обертки перед рукой (или как раз вовремя) и только однажды, вместо того, чтобы создать новое закрытие каждый раз.
добавлено автор Mud, источник

2 ответы

По моему скромному мнению, лучший способ передает vararg как параметр к функции помощника, поскольку вы сделали в своем вопросе.
Альтернативный путь - "пакет - распаковывают":

-- Lua 5.2 only
local t = table.pack(coroutine.resume(co))
do_stuff(t[1])
return table.unpack(t, 2, t.n)
5
добавлено
Я сделал некоторые оценки, и похоже, что странное vararg решение для параметра действительно быстрее также. Необходимо сделать дополнительную работу и вызовы функции, если вы хотите передать вещи через стол...
добавлено автор hugomg, источник
@missingno: vararg решение будет быстрее потому что это doesn' t требуют создания стола.
добавлено автор Mud, источник
@missingno - Любопытное вне темы. В ванили Lua, которые самый быстрый способ создать копию множества местный t_copy = {распаковывают (t)} .:)
добавлено автор Egor Skriptunoff, источник

Идиоматический способ сделать это с неизвестным количеством возвращаемых значений должно обернуть вызов функции в конструктора стола:

local t = { coroutine.resume(co) }
do_stuff(table.remove(t, 1)) 
return unpack(t)  -- table.unpack(t) in lua 5.2

В то время как это также включает создание временного объекта, это должно быть намного более быстро, чем использование закрытия, и это, конечно, намного более опрятно.

2
добавлено
table.remove может вести себя непредсказуемо, если есть нулевые ценности внутри t
добавлено автор Egor Skriptunoff, источник
@NicolBolas - полная форма использования распаковывает (t, от, до) , чтобы избежать непредсказуемости.
добавлено автор Egor Skriptunoff, источник
@EgorSkriptunoff: Технически, если есть ноль , ценности в t , то распаковывают </ код> будет также вести себя непредсказуемо. Так there' s не много выбора здесь.
добавлено автор Nicol Bolas, источник
pro.lua
pro.lua
411 участник(ов)

Правила: Тут можно обсуждать все, что связанно с луа-движки, интерпретаторы/компиляторы, питухан-биндинги, скрипты на сталкер и пр. Запрещена реклама! Срачи и оффтоп не желательны. За нарушение - бан github.com/rjpcomputing/luaforwindows Участник @ProDOT