Что считается истиной
Условие не обязано быть сравнением. После if можно написать любое значение, и Lua сам решит, считать ли его истинным. Правило Lua короткое: false и nil считаются ложью, а всё остальное считается истиной, даже число 0 и пустая строка "":
if 0 then
print("0 считается истиной")
end
if "" then
print("Пустая строка считается истиной")
end
if nil then
print("nil считается истиной")
endПрограмма выведет:
0 считается истиной
Пустая строка считается истинойЗапомните это хорошенько, особенно если вы знакомы с другим языком: в Python, JavaScript или C 0 считается ложью. В Lua это не так, и здесь легко ошибиться:
local seeds = 0
if seeds then
print("Эмма сажает семена")
else
print("У Эммы нет семян")
endПрограмма выведет:
Эмма сажает семенаУ Эммы нет семян, но 0 считается истиной. Чтобы спросить, есть ли семена, сравнивайте: if seeds > 0 then.
Для чего же тогда нужно if seeds then? Оно спрашивает: «есть ли у seeds значение?», то есть «не nil ли оно?». Это полезно, потому что некоторые функции возвращают nil, если им не удалось сделать своё дело. Вы знаете tonumber: она возвращает nil, когда строка — не число:
local answer = "дюжина"
local eggs = tonumber(answer)
if eggs then
print("Яиц: " .. eggs)
else
print("Это не число: " .. answer)
endПрограмма выведет:
Это не число: дюжинаПри answer = "12" в eggs оказалось бы 12, и программа вывела бы Яиц: 12. not подчиняется тому же правилу и всегда возвращает логическое значение: not nil — это true, а not 0 — это false. Поэтому if not eggs then означает «если eggs равно nil» (или false).
И ещё одна ловушка: if seeds == true then — не то же самое, что if seeds then. Оператор == сравнивает точно, а число никогда не равно логическому значению true, так что 5 == true — ложь. Просто не пишите == true.
Задание
- 1
Запустите программу: она выводит
Эмма сажает семена: 0. Исправьте условие так, чтобы Эмма сажала семена, только если их больше 0. Тогда программа выведет:Эмма покупает новые семена - 2
Дедушка Джо записал, сколько яиц ему нужно, но в виде строки
note. В конце программы преобразуйте её с помощьюtonumberи сохраните результат в локальную переменнуюeggs. Затем напишите инструкциюif, в которой условие — простоeggs. Если значение есть, выведитеДедушка Джо хочет яиц: 14(с числом изeggs), а если нет, выведитеЭмма не может прочитать записку:и следом саму записку. Программа выведет:Эмма покупает новые семена Дедушка Джо хочет яиц: 14 - 3
Замените
noteна"четырнадцать".tonumberне может превратить слово в число, поэтомуeggsравноnil, и программа выведет:Эмма покупает новые семена Эмма не может прочитать записку: четырнадцать