Lua/Конструкции языка: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 1:
{{Автоматическая навигация|Предыдущая глава=Типы данных}}
 
== Итераторы ==
В прошлой главе мы рассматривали такой тип как table. Задавать ключи/значения достаточно долгая ручная работа. Автоматизировать эту работу можно при помощи итераторов.
 
И так, попробуем наполнить нашу таблицу 100 элементов, ключ которых, равен значению.<syntaxhighlight lang="lua">
a = {} -- создали пустой массив
for i = 1,100 do a[i] = i end -- добавили 100 элементов
 
</syntaxhighlight>Немного непонятная конструкция, верно? Давайте разберем в ней каждое слово, каждый символ:
 
* for(для) конструкция, после которой следует количество элементов с которыми мы будем работать
* i = 1,100 (переменной i от 1 до 100)
* do (сделать) конструкция, после которой говорится, что мы будем делать с конструкцией
* a[i] = i каждому a[i] с ключом i присвоить значение i (фактически, это создание элемента массива)
* end(конец) указывает на то, что конструкция должны быть закрыта.
* А теперь все вместе: для переменной i от 1 до 100 сделать так, чтобы каждому a[i] был присвоен i и закончить конструкцию
 
Если вы ранее программировали на других языках, то вам привычнее будет такая конструкция:<syntaxhighlight lang="lua">
for i = 1,100 do
a[i] = i
end
 
</syntaxhighlight>Мы создали массив. И, предположим, забыли, что в него добавили и какая его длина. Давайте посмотрим посмотрим на элементы массива:<syntaxhighlight lang="lua">
for i = 1,#a do
print(a[i])
end
--> выводит 100 элементов
</syntaxhighlight>Напомним, что #a - длина массива (в нашем случае, она равна 100)
 
== Условные конструкции ==
Строка 80 ⟶ 52 :
</syntaxhighlight>
 
=== forbreak ===
Break - не является циклом. Он останавливает его выполнение.<syntaxhighlight lang="lua">
Мы ранее рассматривали for как итератор - его называют общим for. Мы же сейчас рассматриваем числовой for
a = 0
while True do
a = a + 1 --> Каждое выполнение цикла увеличивает а на единицу
if a == 13 then --> но когда a достигает 13 - цикл заканчивает свое выполнение
break
end
end
</syntaxhighlight>Как вы видите, чаще всего break используют с условным выражением.
 
== Итераторы ==
В прошлой главе мы рассматривали такой тип как table. Задавать ключи/значения достаточно долгая ручная работа. Автоматизировать эту работу можно при помощи итераторов.
 
И так, попробуем наполнить нашу таблицу 100 элементов, ключ которых, равен значению.<syntaxhighlight lang="lua">
a = {} -- создали пустой массив
for i = 1,100 do a[i] = i end -- добавили 100 элементов
 
</syntaxhighlight>Немного непонятная конструкция, верно? Давайте разберем в ней каждое слово, каждый символ:
 
* for(для) конструкция, после которой следует количество элементов с которыми мы будем работать
* i = 1,100 (переменной i от 1 до 100)
* do (сделать) конструкция, после которой говорится, что мы будем делать с конструкцией
* a[i] = i каждому a[i] с ключом i присвоить значение i (фактически, это создание элемента массива)
* end(конец) указывает на то, что конструкция должны быть закрыта.
* А теперь все вместе: для переменной i от 1 до 100 сделать так, чтобы каждому a[i] был присвоен i и закончить конструкцию
 
Если вы ранее программировали на других языках, то вам привычнее будет такая конструкция:<syntaxhighlight lang="lua">
for i = 1,100 do
a[i] = i
end
 
</syntaxhighlight>Мы бы рекомендовали использовать именно ее.
 
Между for и do, можно поставить не только индекс начала и конца массива, но и шаг с которым будет идти процесс итерации. Это часто называют в других языках как ''start,stop,step'' (начало, конец, шаг) и в других языках эта конструкция аналогична. Например:<syntaxhighlight lang="lua">
for i = 1,100,2 do --> start= 1, stop=100, step = 2
a[i] = i --> 1,3,5,7 и т.д.
end
 
</syntaxhighlight>Мы создали массив. Ии, предположим, забыли, что в него добавили и какая его длина. Давайте посмотрим посмотрим на элементы массива:<syntaxhighlight lang="lua">
for i = 1,#a do
print(a[i])
end
--> выводит 100 элементов
</syntaxhighlight>Напомним, что #a - длина массива (в нашем случае, она равна 100)
 
Можно также перебирать ключи одновременно со значениями:<!-- Проблема с кодом. Перепроверить --><!-- Добавить про io.lines pairs ipars string.gmatch -->
 
<syntaxhighlight lang="lua">
a = {'a' = 1,'b' = 2;'c' = 3}
for k,v in pairs(a) do
print(k,v)
end
</syntaxhighlight>
 
== Goto ==
В Lua существует оператор goto. Он позволяет перепрыгивать в отдельные участки кода, например, выпрыгнуть из цикла в итератор где-то снаружи.
 
Вы не часто встретите в других языках данный оператор и этому есть разумное объяснение: goto часто приводит к ухудшению читаемости кода, создать непредвиденные ситуации для программиста и многое другое. Именно поэтому мы, как и разработчики языка, рекомендуем его использовать ограниченно и обдуманно.
 
Также, есть 3 ограничения:
 
# Нельзя прыгнуть внутрь блока
# Нельзя выпрыгнуть из функции
# Нельзя прыгнуть внутрь области видимости локальной переменной
 
<!-- Дописать -->{{Нижняя автоматическая навигация|Предыдущая глава=Типы данных}}