For (Lua)

Материал из UoPilot
Версия от 10:36, 28 августа 2019; Tatikoma (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

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 обходит все элементы массива, но не обязательно по порядку. 

Смотрите также

While (Lua)
Repeat (Lua)
Break (Lua)