Ваша проблема проста:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Этот код сначала объявляет глобальную переменную с именем names. Затем вы запускаете цикл for. Цикл for объявляет локальную переменную, которая тоже случайно namesвызывается; тот факт, что переменная ранее была определена, namesсовершенно не имеет значения. Любое использование namesвнутри цикла for будет относиться к локальному , а не к глобальному.
Цикл for говорит, что внутренняя часть цикла будет вызываться with names = 1, then names = 2и finally names = 3. Цикл for объявляет счетчик, который считает от первого числа до последнего, и вызывает внутренний код один раз для каждого подсчитываемого значения.
На самом деле вам нужно было что-то вроде этого:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Синтаксис [] - это способ доступа к элементам таблицы Lua. Таблицы Lua отображают «ключи» в «значения». Ваш массив автоматически создает ключи целочисленного типа, которые увеличиваются. Таким образом, ключ, связанный с «Джо» в таблице, равен 2 (индексы Lua всегда начинаются с 1).
Следовательно, вам нужен цикл for, который считает от 1 до 3, что вы и получите. Вы используете переменную count для доступа к элементу из таблицы.
Однако в этом есть недостаток. Что произойдет, если вы удалите один из элементов из списка?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Теперь мы получаем John Joe nil, потому что попытка доступа к значениям из таблицы, которая не существует, приводит к nil. Чтобы этого не произошло, нам нужно считать от 1 до длины таблицы:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
Оператор #длины. Он работает с таблицами и строками, возвращая длину любого из них. Теперь, независимо от того, насколько велик он или маленький names, это всегда будет работать.
Однако есть более удобный способ перебирать массив элементов:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairsэто стандартная функция Lua, которая выполняет итерацию по списку. Этот стиль forцикла, итератор для цикла, использует такую функцию итератора. iЗначение является индексом элемента массива. nameЗначение является значением по этому индексу. Так что в основном он делает за вас много ворчливой работы.