Ваша проблема проста:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Этот код сначала объявляет глобальную переменную с именем names
.Затем вы запускаете цикл for.Цикл for объявляет переменную local , которая также называется names
;тот факт, что переменная ранее была определена с names
, совершенно не имеет значения.Любое использование names
внутри цикла for будет ссылаться на локальный 1011 *, а не на глобальный.
Цикл for говорит, что внутренняя часть цикла будет вызываться с помощью names = 1
, затем names = 2
и, наконец, names = 3
.Цикл for объявляет counter , который считает от первого числа до последнего, и будет вызывать внутренний код один раз для каждого значения, которое он считает.
То, что вы действительно хотели, было примерно таким:
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
является значением по этому индексу.Так что это в основном делает для вас много тяжелой работы.