For (Lua)
Содержание
Описание
for - выполняет цикл несколько раз в соответствии со значением переменной управления циклом. Эта переменная может увеличиваться или уменьшаться при выполнении цикла. Циклы могут быть бесконечными или могут иметь конечное значение для переменной управления. Код будет выполняться до тех пор, пока переменная управления удовлетворяет аргументам команды. Если переменная управления вышла за предел конечного значения, выполняется выход из цикла. Переменная управления является локальной, т. е. существует в пределах цикла.
Также for используется для обхода элементов массива/таблицы.
Синтаксис
Привязка к окну: нет.
Работа со свернутым окном: да.
1-й тип (числовой цикл):
for i = iMin, iMax [, <шаг>] do [строки_скрипта] [break] [строки_скрипта] end
Где:
i - числовая переменная-счётчик
iMin - начальное значение отсчета.
iMax - конечное значение отсчета (включительно).
шаг - шаг цикла (значение, которое при каждом цикле прибавляется к i). Может быть положительным или отрицательным. Необязателен. Если не указан, то равен 1.
iMin, iMax, шаг - вычисляются только один раз, перед выполнением цикла.
break - команда прерывания цикла. Передаёт управление на строку, находящуюся сразу за end.
Допустимо использование дробных чисел. Разделитель точка.
2-й тип (обход элементов массива/таблицы):
Условно можно разделить на 2 вида: pairs и ipairs.
ipairs - цикл перебирает все элементы массива/таблицы с целочисленными ключами в порядке возрастания начиная с единицы. Если значение элемента массива/таблицы nil, то выполняется выход из цикла.
pairs - используется для обхода вообще всех элементов массива/таблицы. Порядок обхода элементов непредсказуем, даже при использовании целочисленных ключей.
for i, value in ipairs(Array) do [строки_скрипта] [break] [строки_скрипта] end
Где:
i - переменная, в которую записывается индекс элемента массива/таблицы.
value - переменная, в которую записывается значение элемента массива/таблицы.
Array - массив или таблица.
for i, value in pairs(Array) do [строки_скрипта] [break] [строки_скрипта] end
Где:
i - переменная, в которую записывается ключ элемента массива/таблицы.
value - переменная, в которую записывается значение элемента массива/таблицы.
Array - массив или таблица.
Примеры простых циклов
--lua for i = 1, 3 do -- шаг не указан, по умолчанию равен 1 msg (i) end -- увидим: 1 2 3
--lua for i = 4, 8, 2 do -- шаг 2 msg ("Миша съел " .. i .. " яблок(а)") end -- увидим: 4 6 8
--lua -- назад, с шагом -1 local a = 4 local b = 2 local s = -1 for j = a, b, s do log ("Считаем назад: " .. j) end log ("Закончили счёт") -- увидим: 4 3 2 закончили
--lua -- вперед, с шагом 1, используем break for k = 2, 6 do log ("Считаем вперед: " .. k .. "A") if k == 4 then -- если переменная 'k' равна 4 break -- прервать цикл end log ("Считаем вперед: " .. k .. "Б") end log ("Закончили счёт") -- увидим: 2А 2Б 3А 3Б 4А Закончили
--lua -- цикл с нецелыми числами. for i = 0.1, 0.7, 0.15 do log (i) end
Примеры циклов обхода массивов
--lua local arr = {40, 50, 20, 10} -- массив arr, элементы: [1] = 40, [2] = 50, [3] = 20, [4] = 10 log ("clear") -- очистить лог log ("mode compact") -- компактный режим for i = 1, #arr do -- #arr - размер массива arr log (i, arr[i]) end log() -- или так for i, value in ipairs(arr) do log (i, value) end -- Когда в массиве отсутствуют пустые элементы (nil) между #arr и ipairs разницы нет.
--lua local arr = {[1] = 40, [2] = 50, [4] = 10} -- массив arr, элементы: [1] = 40, [2] = 50, [3] = nil, [4] = 10, такая индексация не рекомендуется log ("clear") -- очистить лог log ("mode compact") -- компактный режим for i = 1, #arr do log (i, arr[i]) end log() for i, value in ipairs(arr) do log (i, value) end -- А в этом примере разница заметна. 3й элемент пуст поэтому ipairs обошёл только элементы 1 и 2.
--lua local arr = {[1] = 40, [2] = 50, [4] = 10} -- массив arr, элементы: [1] = 40, [2] = 50, [3] = nil, [4] = 10 log ("clear") -- очистить лог log ("mode compact") -- компактный режим for i, value in pairs(arr) do log (i, value) end -- pairs обходит все элементы массива, но не обязательно по порядку.
Примеры циклов обхода таблиц
--lua local arr = {milk = "молоко", [1] = 50, [2] = 70, apple = "яблоко", [3] = 88, [4] = 190} log ("clear") log ("mode compact") for i, value in ipairs(arr) do log (i .. " - это индекс,", value .. " - это значение элемента") end -- ipairs обошёл только целочисленные ключи, т. е. 1, 2, 3, 4, apple и milk были пропущёны.
--lua local arr = {milk = "молоко", [1] = 50, [2] = 70, apple = "яблоко", [3] = 88, [4] = 190} log ("clear") log ("mode compact") for i, value in pairs(arr) do log (i .. " - это индекс,", value .. " - это значение элемента") end -- pairs обходит все элементы массива, но не обязательно по порядку.