Несколько возвращаемых значений
Во многих языках функция возвращает не больше одного значения. В Lua return может вернуть несколько значений через запятую. Эмма записывает, сколько минут занимает работа на ферме, а эта функция переводит минуты в часы и минуты:
local function hoursAndMinutes(minutes)
return minutes // 60, minutes % 60
end
local hours, rest = hoursAndMinutes(135)
print(hours .. " ч " .. rest .. " мин")Программа выводит:
2 ч 15 минВызов возвращает два значения, и они попадают в переменные по порядку: первое — в hours, второе — в rest. Lua умеет присваивать сразу несколько переменных где угодно, не только с функциями: local a, b = 1, 2. Если переменных больше, чем значений, лишние переменные получают nil; лишние значения отбрасываются. Если нужно только второе значение, напишите _ на месте первого, как с ipairs: local _, rest = hoursAndMinutes(135).
print выводит все значения, которые вернула функция, через табуляцию. Но посмотрите, что будет, когда вызов стоит не последним:
local function hoursAndMinutes(minutes)
return minutes // 60, minutes % 60
end
print(hoursAndMinutes(135))
print(hoursAndMinutes(135), "ч")
print((hoursAndMinutes(135)))Программа выводит:
2 15
2 ч
2Вызов даёт все свои значения, только если он последний (или единственный) элемент в списке значений, например среди аргументов print. В любом другом месте используется только его первое значение, поэтому вторая строка выводит 2 и ч, а 15 теряется. Лишние скобки вокруг вызова, как в третьей строке, тоже оставляют только первое значение.
Несколько возвращаемых значений удобны, когда функция сразу выясняет несколько вещей. Эта функция один раз проходит по списку и возвращает и наименьшее, и наибольшее число:
local function smallestAndLargest(list)
local smallest = list[1]
local largest = list[1]
for _, value in ipairs(list) do
smallest = math.min(smallest, value)
largest = math.max(largest, value)
end
return smallest, largest
end
local low, high = smallestAndLargest({7, 3, 9, 4})
print("От " .. low .. " до " .. high)Программа выводит:
От 3 до 9Без нескольких возвращаемых значений понадобились бы две функции, и по списку пришлось бы пройти дважды. Оба значения относятся к одному return и разделены запятой. Два return подряд не работают: первый завершил бы функцию, а Lua вообще не разрешает строку после return.
Задание
- 1
Эмма пакует яйца в коробки по 6 штук. Программа завершается с ошибкой
attempt to call a nil value (global 'packEggs'), потому что такой функции ещё нет. Напишите её над циклом: уpackEggsесть параметрeggs, и она возвращает два значения: сколько полных коробок по 6 яиц набирает Эмма и сколько яиц остаётся. Тогда программа выводит:День 1: коробок: 3, осталось: 2 День 2: коробок: 5, осталось: 1 День 3: коробок: 2, осталось: 0 День 4: коробок: 3, осталось: 0 День 5: коробок: 4, осталось: 1 - 2
Под циклом напишите функцию
totalAndAverageс параметромlist. Она возвращает два значения: сумму чисел в списке и их среднее. Примените её кweek, а затем к списку{6, 9}и выведите результаты так:Сумма: 106, среднее: 21.2 Сумма: 15, среднее: 7.5