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
0

Dí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ě: 20

cenaOdHuga 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 krabici

Porovná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:

true

Prší, 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).

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 Josef

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

7/10