Перебирая таблицы в таблице в Lua

Я зашел в тупик с этим. Вероятно, это будет что-то невероятно простое, и это, скорее всего, приведет к тому, что я врежу голову в стену из-за большого пердежа мозга. Мой вопрос в основном, как вы зацикливаете таблицы в lua, если записи сами являются таблицами?

C ++:

lua_newtable(luaState);
for(auto rec : recpay) {
lua_newtable(luaState);

lua_pushnumber(luaState, rec.amount);
lua_setfield(luaState, -2, "Amount");

lua_pushnumber(luaState, rec.units);
lua_setfield(luaState, -2, "Units");

lua_setfield(luaState, -2, rec.type);
}
lua_setglobal(luaState, "RecuringPayments");

Lua:

for _,RecWT in ipairs(RecuringPayments) do
-- RecWT.Amount = nil?
end

0

Решение

В вашем коде C ++ похоже, что вы устанавливаете подтаблицу по строке как ключ, а не как индекс. Чтобы пройти эту запись, вы должны использовать pairs вместо:

for recType, RecWT in pairs(RecuringPayments) do
assert(RecWT.Amount ~= nil)
end

Обратите внимание, что ipairs только проходит через индексную часть таблицы, ассоциативная часть игнорируется.

В качестве альтернативы, если вы хотите использовать индексный доступ, вам нужно установить значение ключа с помощью lua_settable вместо:

lua_newtable(luaState);
int i = 0;
for(auto rec : recpay)
{
lua_newtable(luaState);

lua_pushnumber(luaState, rec.amount);
lua_setfield(luaState, -2, "Amount");

lua_pushnumber(luaState, rec.units);
lua_setfield(luaState, -2, "Units");

lua_pushnumber(luaState, ++i);
lua_insert(luaState, -2);
lua_settable(luaState, -3);
}
lua_setglobal(luaState, "RecuringPayments");
1

Другие решения

Вы можете использовать рекурсивную функцию, которая обходит таблицы:

function traversetable(tab, array)
local iteratefunc = array and ipairs or pairs
for k, v in iteratefunc(tab) do
if type(v) == "table" then
traversetable(v, array)    --Assumes that type is the same as the parent's table
else
--Do other stuff
end
end
end

Это просто базовый пример, но он дает вам приблизительное представление. array является логическим значением, указывающим, является ли это массивом на основе одного или нет.

0

По вопросам рекламы [email protected]