Я зашел в тупик с этим. Вероятно, это будет что-то невероятно простое, и это, скорее всего, приведет к тому, что я врежу голову в стену из-за большого пердежа мозга. Мой вопрос в основном, как вы зацикливаете таблицы в 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
В вашем коде 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");
Вы можете использовать рекурсивную функцию, которая обходит таблицы:
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
является логическим значением, указывающим, является ли это массивом на основе одного или нет.