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