Výchozí hodnoty

Ze cvičení o parametrech víte, že chybějící argument je nil. Často existuje hodnota, která se hodí pro většinu volání, a jinou chcete předat jen občas. Ema třeba většinou kupuje jeden balíček semen. Pro takové případy dostane parametr výchozí hodnotu. Lua pro ni nemá žádný zvláštní zápis, ale všechno potřebné znáte z lekce o podmínkách: x or vychozi.

local function kupSemena(plodina, balicky)
    balicky = balicky or 1
    print("Semena: " .. plodina .. ", balíčků: " .. balicky)
end

kupSemena("mrkev", 3)
kupSemena("dýně")

Vypíše:

Semena: mrkev, balíčků: 3
Semena: dýně, balíčků: 1

První řádek těla doplní výchozí hodnotu. Když volání balicky předá, je balicky or 1 to předané číslo. Když ne, je balicky nil a nil or 1 je 1. Volání může vynechat jen argumenty na konci, a proto parametry s výchozí hodnotou patří na konec.

Mnoho jiných jazyků píše výchozí hodnotu přímo do závorek: function kupSemena(plodina, balicky = 1). Lua to neumí a takový řádek je syntaktická chyba: ')' expected near '='.

Je tu ale jedna past. or nahradí nejen nil, ale i false. Když je tedy výchozí hodnota true, volající nemůže předat false:

local function nakrm(zvire, hladove)
    hladove = hladove or true
    if hladove then
        print("Krmím: " .. zvire)
    else
        print(zvire .. " nemá hlad")
    end
end

nakrm("Bella")
nakrm("Rex", false)

Vypíše:

Krmím: Bella
Krmím: Rex

Rex hlad nemá, ale false or true je true. Je to stejná past jako u a and b or c v lekci o podmínkách. U parametru, který může být false, proto testujte nil:

local function nakrm(zvire, hladove)
    if hladove == nil then
        hladove = true
    end
    if hladove then
        print("Krmím: " .. zvire)
    else
        print(zvire .. " nemá hlad")
    end
end

nakrm("Bella")
nakrm("Rex", false)

Vypíše:

Krmím: Bella
Rex nemá hlad

Teď výchozí hodnotu dostane jen chybějící argument (nil) a false zůstane false. U čísel a textů stačí x or vychozi, protože ty nikdy nejsou false. I 0 a "" zůstanou, jak jsou, protože v Lua platí za pravdivé.

Pokyny

Obchod se semeny dává Emě občas slevu. Program vypíše 15 a pak skončí chybou attempt to perform arithmetic on a nil value (local 'sleva'), protože druhé volání žádnou slevu nemá. Dejte parametru sleva výchozí hodnotu 0. Program pak vypíše 15 a 12.

Ema většinou kupuje jediný balíček. Dejte parametru balicky výchozí hodnotu 1. Pak na konci programu vypište cenaSemen(4), cenu jednoho balíčku jahodových semen. Program vypíše:

15
12
4

Funkce potrebaVody vrátí, kolik kbelíků vody Ema potřebuje na své záhony: za slunečného dne 2 na záhon, jinak 1. Většina dní je slunečných, a tak má být výchozí hodnota parametru slunecno true. Na konci programu vypište potrebaVody(5), potrebaVody(5, true) a potrebaVody(5, false), každé na samostatný řádek. Poslední vypíše 10, přestože slunečno není. Opravte výchozí hodnotu, aby ty tři řádky byly 10, 10 a 5.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/11