Ваша проблема проста:
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
Значение является значением по этому индексу. Так что в основном он делает за вас много ворчливой работы.