Циклы while, repeat и for

<< 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

Цикл repeatuntil заканчивается условием, идущим следом за 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 прерывает только тот цикл, в теле которого встречается, внешние циклы продолжают выполнение.