Динамическое построение подтаблиц в таблице - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь понять, как динамически создать серию вложенных таблиц внутри таблицы lua.Например,

function BuildsubTable()
   local oTable = {}
   local name  = {"P1","P2"}
  for i = 1, 2 do
    oTable[i] = {name = name[i], "x" = i + 2, "y" = i + 1}
  end
  return oTable
end

ожидаемый результат:

 oTable = {
  {name = "P1", "x"=3, "y"=2},
  {name = "P2", "x"=4, "y"=3}
 }

Что, очевидно, не работает, но вы понимаете, что я пытаюсь сделать.Это довольно простая задача, но в LUA 5.3 она оказывается сложной.Я не могу найти хороший пример построения таблицы таким образом.Любые решения или другие идеи будут оценены.В Python я бы использовал класс или простой словарь.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Ваша проблема в том, что вы цитируете строковые индексы.Общий синтаксис объявления ключа таблицы в конструкторе таблицы: [<key>] = <value>, например, [20] = 20 или ["x"] = i + 2.

Сокращение для ["<key>"] = <value>, то есть для действительных индексов строкИмена переменных, вы можете написать <key> = <value>, например x = i + 2.

В вашем коде вы используете сочетание обоих и напишите { ..., "x" = i + 2, ... }.Быстрый поиск в Google показывает мне, что в Python, который вы упоминаете, вы цитируете строковые ключи в словарях, так что вы, вероятно, смешали это с Lua?

EDIT: я заметил это немного поздно, но вы также можете использоватьipairs для итерации первой таблицы и table.insert для вставки значений:

function BuildsubTable()
    local oTable = {}
    local name  = {"P1","P2"}
    for i,name in ipairs(name) do
        table.insert(oTable, {name = name, "x" = i + 2, "y" = i + 1})
    end
    return oTable
end
0 голосов
/ 26 сентября 2018

DarkWiiPlayers & lhf - правильные ответы.Но вот как вы можете исправить свой текущий код, если намереваетесь использовать строку в качестве ключа

function BuildsubTable()
   local oTable = {}
   local name  = {"P1","P2"}
  for i = 1, 2 do
    oTable[i] = {name = name[i], ["x"] = i + 2, ["y"] = i + 1}
  end
  return oTable
end

Вывод

{
    [1] = { ['name'] = 'P1', ['x'] = 3, ['y'] = 2},
    [2] = { ['name'] = 'P2', ['x'] = 4, ['y'] = 3}
}
0 голосов
/ 25 сентября 2018

Использование

oTable[i] = {name = name[i], x = i + 2, y = i + 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...