Ответ 1
Ключи, которые не имеют значения (т.е.: nil
), не существуют. myTable
- пустая таблица, касающаяся Lua.
Вы можете перебирать пустую таблицу, но это не будет полезно.
Далее
for key,value in myTable do --pseudocode
value = "foobar"
end
Этот "псевдокод" не имеет смысла. Вы не можете изменять таблицу, изменяя содержимое локальной переменной; Lua не работает. Вы не можете получить ссылку на запись в таблице; вы можете получить только значение из таблицы.
Если вы хотите изменить содержимое таблицы, вы должны фактически изменить таблицу. Например:
for key,value in pairs(myTable) do --actualcode
myTable[key] = "foobar"
end
Обратите внимание на использование myTable
. Вы не можете изменить таблицу без использования самой таблицы в какой-то момент. Независимо от того, была ли эта таблица доступной через myTable
или через какую-либо другую переменную, вы храните ссылку на таблицу.
В общем, изменение таблицы при ее итерации через нее может вызвать проблемы. Однако Луа говорит:
Поведение
next
равно undefined, если во время обхода вы присваиваете любое значение несуществующему полю в таблице. Однако вы можете изменить существующие поля. В частности, вы можете очистить существующие поля.
Так что это совершенно верно для изменения значения уже существующего поля. И key
, очевидно, уже существует в таблице, поэтому вы можете его изменить. Вы даже можете установить его на nil
без проблем.
Переменные в Lua являются не более чем держателями для значений. Таблицы содержат значения; myTable[key]
возвращает значение. Вы можете сохранить это значение в переменной, но изменение переменной не изменит значение myTable[key]
. Поскольку таблицы хранятся по ссылке, вы можете изменить содержимое таблицы в одной переменной и увидеть изменения в другой, но это просто содержимое таблицы, а не сама таблица.