Значения по умолчанию
Из упражнения про параметры вы знаете, что недостающий аргумент равен nil. Часто есть значение, которое подходит для большинства вызовов, а другое нужно передавать лишь изредка. Например, Эмма обычно покупает один пакет семян. В таких случаях параметру задают значение по умолчанию. В Lua для этого нет особой записи, но всё необходимое вы уже знаете из урока про условия: x or default.
local function buySeeds(crop, bags)
bags = bags or 1
print("Семена: " .. crop .. ", пакетов: " .. bags)
end
buySeeds("морковь", 3)
buySeeds("тыква")Программа выводит:
Семена: морковь, пакетов: 3
Семена: тыква, пакетов: 1Первая строка тела подставляет значение по умолчанию. Если вызов передаёт bags, то bags or 1 — это переданное число. Если нет, bags равно nil, а nil or 1 — это 1. В вызове аргументы можно пропускать только в конце, поэтому параметры со значением по умолчанию ставят последними.
Во многих других языках значение по умолчанию пишут прямо в скобках: function buySeeds(crop, bags = 1). В Lua так нельзя, и такая строка — синтаксическая ошибка: ')' expected near '='.
Есть одна ловушка. or заменяет не только nil, но и false. Поэтому, если значение по умолчанию — true, вызывающий не сможет передать false:
local function feed(animal, hungry)
hungry = hungry or true
if hungry then
print("Кормим: " .. animal)
else
print("Не кормим: " .. animal)
end
end
feed("Белла")
feed("Рекс", false)Программа выводит:
Кормим: Белла
Кормим: РексРекс не голоден, но false or true — это true. Это та же ловушка, что и с a and b or c в уроке про условия. Для параметра, который может быть false, проверяйте на nil:
local function feed(animal, hungry)
if hungry == nil then
hungry = true
end
if hungry then
print("Кормим: " .. animal)
else
print("Не кормим: " .. animal)
end
end
feed("Белла")
feed("Рекс", false)Программа выводит:
Кормим: Белла
Не кормим: РексТеперь значение по умолчанию получает только отсутствующий аргумент (nil), а false остаётся false. Для чисел и строк достаточно x or default, потому что они никогда не равны false. Даже 0 и "" остаются как есть, ведь в Lua они считаются истинными.
Задание
- 1
Магазин семян время от времени делает Эмме скидку. Программа выводит
15, а затем завершается с ошибкойattempt to perform arithmetic on a nil value (local 'discount'), потому что во втором вызове скидки нет. Задайте параметруdiscountзначение по умолчанию0. Тогда программа выведет15и12. - 2
Чаще всего Эмма покупает один пакет. Задайте параметру
bagsзначение по умолчанию1. Затем в конце программы выведитеseedCost(4)— цену одного пакета семян клубники. Программа выводит:15 12 4 - 3
Функция
waterNeededвозвращает, сколько вёдер воды нужно Эмме для её грядок: 2 на грядку в солнечный день и 1 на грядку в остальные дни. Большинство дней солнечные, поэтомуsunnyпо умолчанию должен бытьtrue. В конце программы выведитеwaterNeeded(5),waterNeeded(5, true)иwaterNeeded(5, false), каждое на отдельной строке. Последнее выводит10, хотя день не солнечный. Исправьте значение по умолчанию, чтобы три строки были10,10и5.