Klíče a hodnoty
V lekci o seznamech držela tabulka prvky popořadě, pod čísly 1, 2, 3… Na nákupní seznam to stačí. Ema si ale chce zapsat i to, co má ve stodole: 12 mrkví, 30 brambor a 4 košíky jahod. Seznam {12, 30, 4} by čísla udržel, ale nic by v něm neříkalo, které číslo patří ke které plodině.
Tabulka umí víc než seznam. Místo čísel 1, 2, 3 může používat názvy:
-- Emina stodola
local stodola = {mrkev = 12, brambory = 30, jahody = 4}
print(stodola.mrkev)
print(stodola["brambory"])Vypíše:
12
30Takto použité tabulce se říká slovník. Stejně jako ve skutečném slovníku vyhledáte slovo a najdete jeho význam, tady vyhledáte klíč (mrkev) a najdete jeho hodnotu (12). Ve složených závorkách jsou dvojice klíč–hodnota oddělené čárkami: klíč, = a hodnota. Hodnotou může být cokoli: číslo, text, true nebo false, dokonce i další tabulka.
Zvláštní typ pro slovníky Lua nemá. Je to tatáž tabulka, kterou znáte ze seznamů, a type(stodola) je "table". Seznam je prostě tabulka, jejíž klíče jsou 1, 2, 3…
Hodnotu přečtete dvěma způsoby a oba znamenají přesně totéž:
stodola.mrkev: tečka a název klíče;stodola["mrkev"]: klíč jako text v hranatých závorkách, podobně jako index v seznamu.
Tečka je kratší, a proto ji uvidíte častěji. Funguje ale jen pro klíče, které splňují pravidla pro názvy proměnných: písmena bez diakritiky, číslice a _, na začátku ne číslice a žádné klíčové slovo jako end. Klíč s mezerou nebo s písmenem s diakritikou, třeba dýně, musíte napsat do hranatých závorek a uvozovek, a to ve složených závorkách i při čtení:
local stodola = {mrkev = 12, ["dýně"] = 4, ["cukrová kukuřice"] = 9}
print(stodola["dýně"])
print(stodola["cukrová kukuřice"])Vypíše:
4
9Bez závorek skončí {dýně = 4} chybou main.lua:1: '}' expected near '<\195>'. Číslo 195 je první bajt písmena ý: Lua přečte jen d a se zbytkem si neví rady. S mezerou je to podobné: Lua přečte jen první slovo a s dalším si neví rady.
Tabulka s více dvojicemi se líp čte, když je každá dvojice na samostatném řádku. Čárka za poslední dvojicí je povolená, což se hodí, když později přidáte další řádek:
local mrkev = {
nazev = "Mrkev",
dny = 3,
prodejniCena = 5,
}
print(mrkev.nazev .. " se prodává za " .. mrkev.prodejniCena .. " mincí")Vypíše:
Mrkev se prodává za 5 mincíCelý slovník si pomocí print(stodola) neprohlédnete: stejně jako u seznamů vypíše jen table: 0x…. A table.concat spojuje jen prvky seznamu. Jak vypsat všechny dvojice, se naučíte dál v této lekci.
Typické chyby:
- Chybějící čárka mezi dvěma dvojicemi:
{mrkev = 12 brambory = 30}skončí chyboumain.lua:1: '}' expected near 'brambory'. - Dvojtečka místo
=, jak se to píše v některých jiných jazycích:{mrkev: 12}skončí chyboumain.lua:1: <name> expected near '12'. - Klíč v uvozovkách, ale bez hranatých závorek:
{"mrkev" = 12}skončí chyboumain.lua:1: '}' expected near '='.
Jak psát:
Pokyny
Vypište, kolik mrkví a brambor je ve stodole. Čísla přečtěte z tabulky: jednou pomocí tečky, jednou pomocí hranatých závorek. Program vypíše:
Mrkev: 12
Brambory: 30Ema sklidila 9 klasů kukuřice. Do složených závorek přidejte dvojici s klíčem "kukuřice" a hodnotou 9. V klíči je písmeno s diakritikou, takže potřebuje hranaté závorky.
Na konci programu vypište kukuřici a součet všech tří plodin. Každé číslo přečtěte z tabulky:
Kukuřice: 9
Celkem: 51Začněte programovat zdarma
1/10