Как явно вызвать значение таблицы Lua при использовании целочисленного счетчика (i, j, k) в цикле for для создания имени / адреса таблицы?

#for-loop #lua #lua-table

#цикл for #lua #lua-таблица

Вопрос:

Честно говоря, я пока не совсем хорошо понимаю Lua. Я пытаюсь перезаписать локальное числовое значение, присвоенное заданному адресу таблицы (это правильный термин?).

Адреса имеют тип:

project.models.stor1.inputs.T_in.default project.models.stor2.inputs.T_in.default и так далее с увеличением stor числа.

Я хотел бы сделать это в цикле for, но не могу найти правильное выражение, чтобы заставить Lua принять всю строку в качестве адреса таблицы (опять же, я надеюсь, что это правильный термин).

До сих пор я пробовал следующее, чтобы объединить строки, но безуспешно вызывал, а затем перезаписывал значение:

 for k = 1,10,1 do
project.models.["stor"..k].inputs.T_in.default = 25
end
 
 for k = 1,10,1 do
"project.models.stor"..j..".T_in.default" = 25
end
 

Редактировать:

Я думаю, что нашел решение согласно https://www.lua.org/pil/2.5.html:

Распространенная ошибка новичков — путать .x с a[x] . Первая форма представляет [«x»], то есть таблицу, индексируемую строкой «x». Вторая форма — это таблица, индексируемая значением переменной x. Видите разницу:

 for k = 1,10,1 do
project["models"]["stor"..k]["inputs"]["T_in"]["default"] = 25
end
 

Ответ №1:

Вы были почти близки.

Lua поддерживает это представление, предоставляя a.name как синтаксический сахар для [«name»].

Подробнее: https://www.lua.org/pil/2.5.html

Вы можете использовать только один синтаксис за раз.

Либо tbl.key или tbl["key"] .

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

В квадратных скобках [] вы можете вычислять выражения времени выполнения.

Правильный способ сделать это:

 project.models["stor"..k].inputs.T_in.default = 25
 

Ввод . models.["stor"..k] не является необходимым и вызывает ошибку. Правильный синтаксис просто models["stor"..k] .

Комментарии:

1. Вау! Я только что нашел это сам. Большое вам спасибо за более краткое объяснение синтаксиса! Будет project["models"]["stor"..k]["inputs"]["T_in"]["default"] = 25 ли это работать?

2. @Martin Да, project["models"] это то же project.models самое, что, например. ( Точно так же)

3. @Martin Важной частью является то, что вы можете их смешивать: foo.bar["baz"] или foo["bar"].baz оба работают