Итоги
В этом уроке вы узнали, что:
- Функция — это именованный кусок кода, который вы пишете один раз и запускаете столько раз, сколько нужно. Определяют её так:
local function name() … end, а вызывают по имени со скобками:name(). Функция существует только со строки, где она определена; вызов раньше даётattempt to call a nil value (global 'name'). - Параметр — это имя в определении, аргумент — значение в вызове:
local function plant(crop, count),plant("морковь", 12). Аргументы попадают в параметры по порядку. Недостающий аргумент равенnil, а лишние игнорируются. returnотдаёт значение на место вызова и завершает функцию.printтолько показывает значение; функция безreturnдаётnil. Функция, которая что-то вычисляет, должна возвращать результат.return a, bвозвращает несколько значений:local boxes, left = packEggs(20). Вызов даёт все свои значения только как последний элемент списка.- Значение по умолчанию подставляют в начале функции:
bags = bags or 1. Для параметра, который может бытьfalse, проверяйтеif x == nil then. - Локальная переменная существует от своей строки до конца своего блока, а функция видит локальные переменные, созданные выше неё. Переменная без
local— глобальная: опечатка тихо создаёт новую, и любая функция может её перезаписать. Поэтому каждая переменная и каждая функция —local. - Функция — это значение: её можно сохранить в переменной и передать другой функции, без скобок.
function(x) … endбез имени — анонимная функция. table.sort(t, function(a, b) return a > b end)сортирует по вашему правилу: функция возвращаетtrue, когдаaидёт передb, иfalseдля равных элементов. Элементы, которые по правилу равны, могут оказаться в любом порядке, поэтому, когда это важно, добавьте второе правило.- Замыкание — это функция, которая запоминает локальные переменные создавшей её функции, например
countу счётчика. error("сообщение")останавливает программу с сообщениемmain.lua:N: сообщение(error(message, 0)— без позиции), аassert(condition, message)делает то же, если условие не выполнено.pcall(f, …)перехватывает ошибку: возвращаетtrueи результаты либоfalseи сообщение.
В следующем уроке вы по-новому используете таблицы: как словари, которые хранят значения под именами, а не под номерами, — например, сколько каких культур лежит в амбаре.
Задание
- 1
Давайте потренируемся. Напишите функцию
totalAndBestс параметромlist, которая возвращает два значения: сумму списка и его наибольшее число. Примените её кsalesи к списку{5, 9, 3}. Программа выводит:Всего: 142, максимум: 48 Всего: 17, максимум: 9 - 2
Напишите функцию
withBonusс параметрамиamountиpercent. Она возвращаетamountплюсpercentпроцентов от него, с округлением вниз через//:amount + amount * percent // 100. Значениеpercentпо умолчанию —10. ВыведитеwithBonus(142)иwithBonus(142, 50). Программа выводит156и213. - 3
Отсортируйте
salesот лучшего дня к худшему с помощью функции сравнения и выведите, соединив элементы пробелами. Программа выводит48 35 27 20 12.