Parametry a argumenty
Funkce ranniPrace dělá pokaždé přesně totéž. Často ale chcete, aby funkce udělala skoro totéž, jen pokaždé s jinou hodnotou: zalila mrkev, pak brambory. Takové hodnoty funkce dostává přes parametry:
local function zalij(plodina)
print("Zalévám: " .. plodina)
end
zalij("mrkev")
zalij("brambory")Vypíše:
Zalévám: mrkev
Zalévám: bramboryV definici je plodina v závorkách parametr: lokální proměnná funkce, kterou funkce může používat ve svém těle. Ve volání je hodnota v závorkách, "mrkev", argument. Když funkci zavoláte, Lua uloží argument do parametru a pak provede tělo funkce. Při prvním volání je plodina "mrkev", při druhém "brambory".
Ta dvě slova se snadno pletou, tak si zapamatujte: parametr je název v definici, argument je hodnota ve volání. Argumentem může být i proměnná nebo výpočet, třeba zalij(plodiny[1]). Argumenty předáváte už od první lekce: "Ahoj" v print("Ahoj") je argument.
Funkce může mít víc parametrů, oddělených čárkami. Argumenty se do nich dosadí podle pořadí: první argument do prvního parametru, druhý do druhého a tak dál:
local function zasad(plodina, pocet)
print("Na záhon: " .. plodina .. ", kusů: " .. pocet)
end
zasad("mrkev", 12)
zasad(12, "mrkev")Vypíše:
Na záhon: mrkev, kusů: 12
Na záhon: 12, kusů: mrkevDruhé volání má argumenty prohozené, takže 12 se dostalo do plodina a "mrkev" do pocet. Lua neví, co hodnoty znamenají, zná jen jejich pořadí.
Mnoho jazyků kontroluje, že každé volání předá přesně tolik argumentů, kolik má funkce parametrů. Lua ne. Chybějící argument je prostě nil a přebývající se zahodí:
local function zasad(plodina, pocet)
print(plodina, pocet)
end
zasad("pšenice")
zasad("kukuřice", 5, "navíc")Vypíše:
pšenice nil
kukuřice 5To se může hodit, jak uvidíte ve cvičení o výchozích hodnotách. Zapomenutý argument ale není chyba už ve volání. Chyba se ukáže až později, uvnitř funkce, která hodnotu nil použije:
local function zasad(plodina, pocet)
print("Na záhon: " .. plodina .. ", kusů: " .. pocet)
end
zasad("pšenice")Program skončí chybou:
main.lua:2: attempt to concatenate a nil value (local 'pocet')
stack traceback:
main.lua:2: in local 'zasad'
main.lua:5: in main chunkHláška ukazuje na řádek 2 ve funkci, ale skutečná chyba je ve volání na řádku 5. Řádky pod stack traceback: ukazují, jak se tam program dostal. Čtěte je odspodu: hlavní program (main chunk) zavolal na řádku 5 funkci zasad a v ní selhal řádek 2. Když chybová hláška jmenuje parametr, jako tady local 'pocet', zkontrolujte volání funkce: předává každé z nich všechny argumenty, a ve správném pořadí?
Jak psát:
Pokyny
Ema sází plodiny do řádků a vy je nakreslíte písmeny. Napište lokální funkci nakresliRadek se dvěma parametry, rostlina a pocet. Funkce vypíše text rostlina tolikrát, kolik je pocet, a to na jeden řádek: v cyklu for ho vypisujte pomocí io.write a po cyklu řádek ukončete pomocí print().
Pod funkcí zavolejte nakresliRadek("M", 5) pro řádek pěti mrkví a nakresliRadek("B", 3) pro řádek tří brambor. Program vypíše:
MMMMM
BBBArgumentem může být i proměnná. Emin jahodový záhon má tvar trojúhelníku: každý řádek má o jednu rostlinu víc než ten předchozí. Pod obě volání napište cyklus for, ve kterém i jde od 1 do 4 a který volá nakresliRadek("J", i). Funkce v každém průchodu cyklem dostane jiný argument, a tak program nakreslí:
J
JJ
JJJ
JJJJZačněte programovat zdarma
2/11