Преобразование значений
Число может прятаться и в тексте: "12" в кавычках — это не число 12, а текст из символов 1 и 2. Программы постоянно получают числа в виде текста: то, что человек набрал на клавиатуре, строку из файла, цену на записке. А print показывает и то и другое одинаково, поэтому на глаз их не различить:
local eggs = 12
local note = "12"
print(eggs, note)
print(type(eggs), type(note))Программа выведет:
12 12
number stringФункция tonumber превращает текст в число. Если текст — не число, она возвращает nil:
print(tonumber("12"))
print(tonumber("2.5"))
print(tonumber(" 7 "))
print(tonumber("12 яиц"))
print(tonumber("2,5"))Программа выведет:
12
2.5
7
nil
nilПробелы вокруг числа не мешают, а всё остальное в тексте мешает, даже десятичная запятая. Поскольку результатом может быть nil, его полезно проверять; как это делать, вы узнаете в уроке об условиях.
Функция tostring работает наоборот: она превращает любое значение в текст. Она нужна, когда логическое значение или nil надо склеить с текстом с помощью ..:
local barnOpen = true
print("Амбар открыт: " .. tostring(barnOpen))
print("Тыквы: " .. tostring(nil))Программа выведет:
Амбар открыт: true
Тыквы: nilЧислам она не нужна: .. превращает их в текст сам, как в "Монеты: " .. 120.
Lua умеет и сам превращать текст в число, когда вы считаете с ним:
print("10" + 5)
print("10" * "2")
print("10" .. 5)Программа выведет:
15
20
105Последняя строка ничего не считает: .. всегда склеивает, поэтому "10" и 5 дают текст 105. Не полагайтесь на такие преобразования. Такая программа работает, только пока текст действительно число: "десять" + 5 останавливается с ошибкой attempt to add a 'string' with a 'number'. А сравнения, о которых вы узнаете в следующем уроке, не преобразуют ничего. С tonumber в коде ясно видно, что происходит преобразование, и вы получаете nil вместо ошибки, который можно проверить.
Задание
- 1
Преобразуйте
carrotsSoldиcarrotPriceв числа с помощьюtonumber, перемножьте их и выведите, сколько Эмма заработала на моркови:Морковь: 60 монет - 2
На следующей строке выведите, всё ли Эмма продала. Склейте значение
soldOutс текстом с помощью..; это логическое значение, поэтому понадобитсяtostring:Морковь: 60 монет Распродано: true - 3
Про тыквы Эмма написала «около 3», а это не число. Выведите, что
tonumberделает сpumpkinsSold, после текста"Тыквы:"и запятой:Морковь: 60 монет Распродано: true Тыквы: nil