Цикл в Lua
мое задание-как сделать цикл for. Я понял это в терминах чисел, но не могу понять это в терминах имен. Я хотел бы создать цикл for, который запускает список имен. Ниже то, что у меня есть до сих пор:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Я пробовал некоторые другие вещи, но это просто не работает, терминал всегда просто списки 1, 2, 3... Что я делаю не так?
3 ответов:
ваша проблема проста:
names = {'John', 'Joe', 'Steve'} for names = 1, 3 do print (names) endэтот код сначала объявляет глобальную переменную с именем
names. Затем, вы начинаете цикл. Цикл for объявляет a местные переменная, которая просто называетсяnamesтоже; тот факт, что переменная ранее был определен сnamesсовершенно не имеет значения. Любое использованиеnamesвнутри цикла for будет ссылаться на местные, а не глобальный.цикл for говорит, что внутренняя часть цикла будет вызываться с помощью
names = 1, потомnames = 2, и окончательноnames = 3. Цикл for объявляет a счетчик это считается от первого числа до последнего, и он будет вызывать внутренний код один раз для каждого значения, которое он считает.то, что вы на самом деле хотели было что-то вроде этого:
names = {'John', 'Joe', 'Steve'} for nameCount = 1, 3 do print (names[nameCount]) endсинтаксис [] - это способ доступа к членам таблицы Lua. Таблицы Lua отображают "ключи"на " значения". Ваш массив автоматически создает ключи целого числа типа, которые увеличиваются. Таким образом, ключ, связанный с "Joe" в таблице, равен 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]) endThe
#оператор длину. Он работает с таблицами и строками, возвращая длину любого из них. Теперь, независимо от того, насколько большой или маленькийnamesполучает, это всегда будет работать.однако есть более удобный способ перебора массива элементов:
names = {'John', 'Joe', 'Steve'} for i, name in ipairs(names) do print (name) end
ipairs- это стандартная функция Lua, которая выполняет итерацию по списку. Этот стильforцикл, итератор для цикла, использует этот вид функции итератора. Элементiзначение-это индекс записи в массиве. Элементnameзначение значение. Так что это в основном делает много ворчать работу для вас.
чтение онлайн (таблицы учебник) кажется, что таблицы ведут себя как массивы, поэтому вы ищете:
Способ 1
names = {'John', 'Joe', 'Steve'} for i = 1,3 do print( names[i] ) endWay2
names = {'John', 'Joe', 'Steve'} for k,v in pairs(names) do print(v) end
Способ 1 использует таблицу
index/key, на столеnamesкаждый элемент имеет ключ, начиная с 1, например:names = {'John', 'Joe', 'Steve'} print( names[1] ) -- prints Johnтак что вы просто сделать
iидти от 1 до 3.On Way2 вместо этого вы указываете, какую таблицу вы хотите запустить, и назначаете переменную для ее ключа и значения, например:
names = {'John', 'Joe', myKey="myValue" } for k,v in pairs(names) do print(k,v) endпечатает следующее:
1 John 2 Joe myKey myValue
names = {'John', 'Joe', 'Steve'} for names = 1, 3 do print (names) end
- вы удаляете таблицу и заменяете ее на int
- вы не тянете значение из таблицы
попробуй:
names = {'John','Joe','Steve'} for i = 1,3 do print(names[i]) end
Comments