Строковые функции
На ферме Эммы тексты повсюду: названия культур, вывески на рынке, записки дедушки Джо. В программировании текст называют строкой: это цепочка символов, идущих один за другим. В этом уроке вы научитесь работать со строками: менять их, разрезать на части, искать в них и аккуратно собирать из частей.
Lua хранит функции для работы со строками в таблице string. string.upper возвращает текст заглавными буквами, string.lower — строчными, а string.len — его длину, то же число, что даёт #:
local crop = "Pumpkin"
print(string.upper(crop))
print(string.lower(crop))
print(string.len(crop), #crop)Он выводит:
PUMPKIN
pumpkin
7 7Есть и более короткая запись того же самого: crop:upper(). Двоеточие означает «возьми функцию upper из string и передай ей crop первым аргументом», так что crop:upper() — короткая запись string.upper(crop). Функцию, вызванную с двоеточием, называют методом. Большинство программистов на Lua вызывают строковые функции именно так, и этот курс тоже. (Как работает двоеточие и как писать собственные методы, вы узнаете в следующем уроке.)
local crop = "Pumpkin"
print(crop:upper(), crop:lower(), crop:len())Он выводит:
PUMPKIN pumpkin 7Метод работает и со строкой, записанной прямо в коде, но такую строку нужно взять в скобки: ("pumpkin"):upper(). Без них это синтаксическая ошибка:
print("pumpkin":upper())main.lua:1: ')' expected near ':'Ещё две типичные ошибки:
- Точка вместо двоеточия.
crop.upper()вызываетupper, не передав ей строку, и программа завершается с ошибкойbad argument #1 to 'upper' (string expected, got no value): первого аргумента, строки, нет. Двоеточие передало бы его. - Забытые скобки.
print(crop:upper)— это синтаксическая ошибкаfunction arguments expected near ')'.
Строковые функции никогда не меняют строку, которую им передают. Строку в Lua вообще нельзя изменить: функции возвращают новую строку. Строка кода с одним лишь crop:upper() создаёт новую строку и тут же выбрасывает её. Чтобы сохранить результат, запишите его в переменную:
local crop = "pumpkin"
crop:upper()
print(crop)
crop = crop:upper()
print(crop)Он выводит:
pumpkin
PUMPKINЕщё две функции: rep повторяет строку заданное число раз, а если передать ей второй аргумент, ставит его между копиями. reverse переворачивает строку:
local eggs = 7
print("Яйца: " .. ("#"):rep(eggs))
print(("ha"):rep(3, " "))
print(("stressed"):reverse())Он выводит:
Яйца: #######
ha ha ha
dessertsОдно предупреждение заранее: русские буквы (как и буквы с акцентами в других языках, например é или ñ) требуют особого внимания. ("пюре"):upper() возвращает пюре без изменений, а #"пюре" равно 8, а не 4. Почему так и что с этим делать, вы узнаете дальше в этом уроке. А пока строки, которые считаются и изменяются, написаны в примерах и упражнениях по-английски.
Задание
- 1
Эмма хочет, чтобы вывеску было видно издалека. Измените первый
printтак, чтобы он выводил вывеску заглавными буквами, с помощью методаupper:STRAWBERRIES FOR 4 COINS - 2
Поместите вывеску в рамку: выведите над ней и под ней строку из символов
=ровно такой же длины, как вывеска. Строку делайте с помощьюrepи длины вывески, а не набирайте символы вручную. Вывод будет начинаться так:======================== STRAWBERRIES FOR 4 COINS ======================== - 3
Дедушка Джо любит загадки: он написал вывеску для своих яиц задом наперёд. Под его загадкой выведите её в перевёрнутом виде с помощью
reverse:Fresh Eggs.