Výchozí hodnoty
and a or umějí víc než spojovat podmínky. Nedávají jen true, nebo false: dávají jednu ze svých dvou hodnot. a or b dá a, pokud a platí jako pravda, a jinak b:
print(nil or "neznámý")
print("Ema" or "neznámý")
print(0 or 12)Vypíše:
neznámý
Ema
0Díky tomu se or skvěle hodí na výchozí hodnotu: hodnotu, která se použije, když je proměnná nil. Obchodník Hugo Emě možná řekne svou cenu za dýni, a možná ne:
local cenaOdHuga
local cena = cenaOdHuga or 20
print("Cena dýně: " .. cena)Vypíše:
Cena dýně: 20cenaOdHuga je nil, takže cena dostane výchozí hodnotu 20. Kdyby Hugo řekl 25, byla by cena 25. Čtěte to jako „Hugova cena, a jinak 20“. Pamatujte ale na poslední řádek prvního příkladu: or nahradí jen nil a false. 0 platí jako pravda, takže 0 or 12 je 0.
Lua provádí or až nakonec, po všech ostatních operátorech včetně ... V delším výrazu ho proto dejte do závorek: "Cena: " .. (cenaOdHuga or 20). Bez nich se Lua v "Cena: " .. cenaOdHuga or 20 nejdřív pokusí připojit k textu nil a skončí chybou attempt to concatenate a nil value (local 'cenaOdHuga').
a and b funguje obráceně: pokud a platí jako nepravda, dá a, a jinak b. Dohromady podmínka and x or y dá x, když je podmínka pravdivá, a y, když není. Je to jako malý if s else na jednom řádku:
local vejce = 14
local krabice = vejce >= 12 and "plnou krabici" or "půl krabice"
print("Ema balí " .. krabice)Vypíše:
Ema balí plnou krabiciPorovnání je pravdivé, takže vejce >= 12 and "plnou krabici" dá "plnou krabici" a "plnou krabici" or "půl krabice" dá "plnou krabici", protože text platí jako pravda. S 8 vejci by porovnání dalo false, false and … by dalo false a false or "půl krabice" by dalo "půl krabice".
Tenhle trik selže, když je prostřední hodnota false nebo nil:
local prsi = true
local potrebujeVodu = prsi and false or true
print(potrebujeVodu)Vypíše:
truePrší, takže pole by vodu potřebovat nemělo. Jenže prsi and false dá false a false or true dá true. podmínka and x or y používejte, jen když x nemůže být false ani nil, například když je to text nebo číslo. Jinak napište if s else (nebo tady prostě not prsi).
Jak psát:
Pokyny
Spusťte program: skončí chybou, protože zakaznik je nil. Pomocí or zařiďte, aby program u zákazníka bez jména napsal neznámý. Program pak vypíše:
Vejce: 6
Zákazník: neznámýVejce stojí 3 mince, ale kdo koupí 10 vajec nebo víc, zaplatí za každé jen 2 mince. Mezi oba řádky s print vytvořte lokální proměnnou cenaZaVejce, která je 2, když je vejce aspoň 10, a jinak 3. Napište ji na jeden řádek pomocí and a or. Pak vypište cenu za všechna vejce. Program vypíše:
Vejce: 6
Cena: 18 mincí
Zákazník: neznámýPro 10 vajec přijde děda Josef: změňte zakaznik na "děda Josef" a vejce na 10. Program vypíše:
Vejce: 10
Cena: 20 mincí
Zákazník: děda JosefZačněte programovat zdarma
7/10