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	5

Totéž 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	5

Metodu 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čí chybou bad 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á chyba function 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
MRKEV

A 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 ivonelej

Poslední řá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.

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 MINCE

Dejte 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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

1/9