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ů: 1První řá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: RexRex 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á hladTeď 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é.
Jak psát:
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
4Funkce 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
5/11