Подтвердить что ты не робот

Для Loop on Lua

Мое назначение - как сделать цикл for. Я понял это с точки зрения чисел, но не могу понять это с точки зрения имен. Я хотел бы создать цикл for, который запускает список имен. Ниже приводится то, что у меня есть до сих пор:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

Я пробовал другие вещи, но он просто не работает, терминал всегда просто перечисляет 1, 2, 3... Что я делаю неправильно?

4b9b3361

Ответ 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 является значение этого индекса. Так что это в основном делает для вас много работы.

Ответ 2

Читая онлайн (руководство по таблицам), кажется, что таблицы ведут себя как массивы, поэтому вы ищете:

Way1

names = {'John', 'Joe', 'Steve'}
for i = 1,3 do print( names[i] ) end

Way2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end

Way1 использует таблицу index/key, в вашей таблице names каждый элемент имеет ключ, начинающийся с 1, например:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

Итак, вы просто делаете i переходом от 1 до 3.

В Way2 вместо этого вы указываете, какую таблицу вы хотите запустить, и назначьте переменную для ее ключа и значения, например:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

печатает следующее:

1   John
2   Joe
myKey   myValue

Ответ 3

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  • Вы удаляете свою таблицу и заменяете ее на int
  • Вы не вытаскиваете значение из таблицы

Try:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end