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