Для петли на луа - PullRequest
       19

Для петли на луа

72 голосов
/ 01 октября 2011

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

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

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

Ответы [ 3 ]

177 голосов
/ 01 октября 2011

Ваша проблема проста:

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

16 голосов
/ 01 октября 2011

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

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
0 голосов
/ 01 января 2016
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. Вы удаляете свою таблицу и заменяете ее на int
  2. Вы не извлекаете значение из таблицы

Попробуйте:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...