<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Язык и синтаксис > Операторы > Циклы while, repeat и for |
Lua имеет три типа циклов - while, repeat и for.
Цикл while
Цикл while является циклом с предусловием, то есть условие выполнения цикла задается в начале объявления. Цикл выполняется, до тех пор пока условие является истинным.
while выражение do
--код цикла
end
Пример
a=1
while a<10 do --условие выполнения - выполняем пока a меньше 10
a=a+1 --прибавляем 1
end
Цикл repeat
Цикл repeat является циклом с условием в конце, то есть содержимое данного цикла будет выполнено как минимум один раз. Цикл выполняется до тех пор пока условие не станет истинным (то есть пока условие ложно.)
repeat
--код цикла
until выражение
Пример
a=1
repeat
a=a+1 --прибавляем 1
until a>=10 --условие выхода из цикла - a больше или равно 10
Цикл repeat–until заканчивается условием, идущим следом за until, поэтому в условии можно ссылаться на локальные переменные, описанные внутри цикла.
Цикл for
Оператор for допускает чиcлoвую и oбoбщeнную формы записи.
В числовой форме for выполняет блок кода до тех пор, пока переменная цикла, изменяющаяся в арифметической прогрессии, не достигнет установленного порога.
for var,limit,step do
--код цикла
end
Где:
•var - инкрементируемая переменная;
•limit - значение, при превышении которого переменной var цикл будет завершен;
•step - шаг изменения значения. Если отсутствует, то по умолчанию используется 1;
Пример
k=0
for i=0,10,1 do --увеличиваем i от 0 до 10, с шагом в 1
k=k+i; --прибавляем к k значение i
end
Обобщенная форма оператора for реализована с использованием функций итepaтopoв. На каждой итерации для получения нового значения переменной цикла вызывается итepaтop. Цикл заканчивается, когда итepaтop вернет nil. В качестве такого итератора применяют функцию pairs.В языке C++ и C# аналогом данного цикла является цикл foreach. С помощью данного типа цикла удобно выполнять перебор значений в массивах.
Синтаксис расширенного оператора for:
for namelist in explist do
--код цикла
end
В качестве примера рассмотрим перебор элементов таблицы (массива) числовым и обобщенным for - сложим элементы таблицы.
Пример числовой формы:
mytable={10,20,30,40} --инициализация таблицы значениями
sum=0 -- переменная суммы
for i=1,4,1 do --перебираем элементы с 1 (нумерация индексов таблиц в Lua идет с 1), по 4 элемент, с шагом в 1
sum=sum+mytable[i] --суммируем
end
Пример обобщенной формы:
mytable={10,20,30,40} --инициализация таблицы значениями
sum=0 -- переменная суммы
for i,v in pairs(mytable) do --перебираем элементы. i - индекс значения, v - значение
sum=sum+v --суммируем
end
Логическое выражение в циклах, как и в управляющих конструкциях может возвращать любое значение. Значения false и nil считаются ложными. Все остальные значения считаются истинными (в том числе значение 0 и пустая строка !).
Для досрочного прерывания всех видов циклов используется оператор break. Пример, прерывания цикла for:
mytable={10,20,30,40} --инициализация таблицы значениями
sum=0 -- переменная суммы
for i,v in pairs(mytable) do --перебираем элементы. i - индекс значения, v - значение
sum=sum+v --суммируем
if sum>80 then
break --если сумма превысила 80, досрочно выходим
end
end
Оператор break прерывает только тот цикл, в теле которого встречается, внешние циклы продолжают выполнение.