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: brambory

V 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ů: mrkev

Druhé 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	5

To 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 chunk

Hláš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í?

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
BBB

Argumentem 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
JJJJ

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

2/11