Funkce pro řetězce
Texty jsou na Emině farmě všude: názvy plodin, cedule na trhu, vzkazy od dědy Josefa. V programování se textu říká řetězec, protože je to řetěz znaků, jeden za druhým. V této lekci se naučíte s řetězci pracovat: měnit je, stříhat na části, hledat v nich a úhledně je skládat.
Funkce pro řetězce má Lua uložené v tabulce string. string.upper vrátí text velkými písmeny, string.lower malými a string.len jeho délku, totéž číslo jako #:
local plodina = "Mrkev"
print(string.upper(plodina))
print(string.lower(plodina))
print(string.len(plodina), #plodina)Vypíše:
MRKEV
mrkev
5 5Totéž se dá napsat kratší cestou: plodina:upper(). Dvojtečka znamená „vezmi funkci upper z tabulky string a dej jí plodina jako první argument“. plodina:upper() je tedy zkratka za string.upper(plodina). Funkci volané přes dvojtečku se říká metoda. Většina programátorů v Lua volá funkce pro řetězce právě takhle a stejně to bude dělat i tento kurz. (Jak dvojtečka funguje a jak napsat vlastní metody, se dozvíte v příští lekci.)
local plodina = "Mrkev"
print(plodina:upper(), plodina:lower(), plodina:len())Vypíše:
MRKEV mrkev 5Metodu můžete zavolat i na textu napsaném přímo v kódu, jen ho musíte dát do závorek: ("mrkev"):upper(). Bez nich je to syntaktická chyba:
print("mrkev":upper())main.lua:1: ')' expected near ':'Další dvě časté chyby:
- Tečka místo dvojtečky.
plodina.upper()zavoláupper, ale text jí nepředá, a program skončí chyboubad argument #1 to 'upper' (string expected, got no value): chybí první argument, tedy text. Dvojtečka by ho předala sama. - Zapomenuté závorky.
print(plodina:upper)je syntaktická chybafunction arguments expected near ')'.
Funkce pro řetězce nikdy nemění text, který dostanou. Řetězec se v Lua dokonce změnit vůbec nedá: funkce vám vždy vrátí nový text. Řádek, na kterém je jen plodina:upper(), nový text vytvoří a hned ho zahodí. Když ho chcete mít, uložte si ho:
local plodina = "mrkev"
plodina:upper()
print(plodina)
plodina = plodina:upper()
print(plodina)Vypíše:
mrkev
MRKEVA ještě dvě funkce: rep zopakuje text několikrát, a když jí dáte druhý argument, vloží ho mezi jednotlivé kopie. reverse text otočí pozpátku:
local vejce = 7
print("Vejce: " .. ("#"):rep(vejce))
print(("ha"):rep(3, " "))
print(("jelenovi pivo nelej"):reverse())Vypíše:
Vejce: #######
ha ha ha
jelen ovip ivonelejPoslední řádek je známý palindrom: pozpátku se čte stejně, jen mezery jsou jinde.
Jedno varování předem: písmena s diakritikou potřebují zvláštní péči. ("dýně"):upper() vrátí DýNě a #"dýně" je 6, ne 4. Proč a co s tím, se dozvíte později v této lekci. Do té doby můžete texty s diakritikou klidně vypisovat, spojovat a hledat v nich, ale počítat a měnit budou cvičení jen slova bez diakritiky.
Jak psát:
Pokyny
Ema chce, aby lidé ceduli přečetli i zdálky. Změňte první print tak, aby vypsal ceduli velkými písmeny pomocí metody upper:
JAHODY ZA 4 MINCEDejte ceduli do rámečku: nad ní a pod ní vypište řádek ze znaků =, přesně tak dlouhý jako cedule. Řádek vytvořte pomocí rep a délky cedule, ne vypsáním znaků. Výpis pak začíná takto:
=================
JAHODY ZA 4 MINCE
=================Děda Josef má rád hádanky: nápis pro svůj stánek s vejci napsal pozpátku. Pod jeho hádanku vypište nápis otočený pomocí reverse: Vejce na prodej.
Začněte programovat zdarma
1/9