nil: нет значения
Иногда у переменной нет значения. Для этого в Lua есть особое значение, nil, которое означает «ничего». Переменная, которую вы создаёте без = и значения, хранит nil:
local strawberries
print(strawberries)
print("Клубника:", strawberries)Программа выведет:
nil
Клубника: nilnil пригодится для того, что ещё неизвестно или отсутствует. Его можно и самим сохранить в переменной, strawberries = nil, когда переменная больше не должна ничего хранить. Но с nil нельзя считать, и его нельзя склеить с текстом:
local coins
print("Монеты: " .. coins)Lua сообщает:
main.lua:2: attempt to concatenate a nil value (local 'coins')Читайте сообщение с конца. (local 'coins') — это переменная: локальная, по имени coins. a nil value — то, что в ней хранилось. А attempt to concatenate — то, что Lua пытался с ней сделать: приклеить к тексту (concatenate значит «склеивать»). С +, - и другими операторами сообщение будет attempt to perform arithmetic on a nil value (local 'coins'): попытка вычислить.
Самый частый источник nil — опечатка в имени:
local coins = 120
print(cions)Программа выведет:
nilОшибки нет! Lua не нашёл локальной переменной с именем cions, поэтому стал искать глобальную. Такой переменной тоже нет, а у несуществующей переменной значение nil. print выводит его без жалоб. Ошибка появляется, только когда программа что-то делает со значением:
local coins = 120
print("Монеты: " .. cions)Lua сообщает:
main.lua:2: attempt to concatenate a nil value (global 'cions')Слово в скобках подсказывает, в чём дело:
local: имя правильное, но у переменной ещё нет значения. Ищите строку, в которой она должна была его получить.global: все ваши переменные локальные, значит, такой, скорее всего, нет. Ищите опечатку или неправильную заглавную букву:Coins— это не то же имя, чтоcoins.
Задание
- 1
Запустите программу и прочитайте ошибку. Куры снесли сегодня 12 яиц: исправьте строку, которая создаёт
eggs, чтобы программа вывела:Куры: 4 Яйца: 12 - 2
Добавьте в конец программы эту строку, вместе с опечаткой, и запустите программу:
print("Молоко: " .. mlik .. " литров")Прочитайте ошибку. Затем исправьте имя, чтобы программа вывела ещё и молоко, которое дала корова Белла:
Куры: 4 Яйца: 12 Молоко: 6 литров - 3
Эмма пока не знает, сколько клубники соберёт. Ниже создайте переменную
strawberriesбез значения и выведите её после текста"Клубника:"через запятую. В отличие от.., запятая работает сnil:Куры: 4 Яйца: 12 Молоко: 6 литров Клубника: nil