"Для каждого" цикла в таблице lua с парами значений ключа - программирование

"Для каждого" цикла в таблице lua с парами значений ключа

Скажем, у меня есть таблица, определенная так:

myTable = { myValue = nil, myOtherValue = nil}

Как бы я перебирал его в для каждого цикла моды, как это?

  for key,value in myTable do --pseudocode
        value = "foobar"
  end

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

4b9b3361

Ответ 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]. Поскольку таблицы хранятся по ссылке, вы можете изменить содержимое таблицы в одной переменной и увидеть изменения в другой, но это просто содержимое таблицы, а не сама таблица.