18 июл. 2008 г.

Lua: Динамический список возвращаемых значений без создания таблицы

Задача
print(
tvalues(
{ a = 1, b = 2, c = 3 },
"a", "b", "xxx", "c", "yyy"
)
)
--> 1 2 nil 3 nil

Типичное решение требует создания таблицы:
function tvalues(t, ...)
local n, r = select("#", ...), { }
for i = 1, n do
t[i] = t[select(i, ...)]
end
return unpack(r, 1, n)
end

Shmuel Zeigerman посоветовал использовать следующий рекурсивный подход:
function tvalues(t, ...)
local key = (...)
if key ~= nil then
return t[key], tvalues(t, select(2, ...))
end
return nil
end