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
30

Takto 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
9

Bez 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čí chybou main.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čí chybou main.lua:1: <name> expected near '12'.
  • Klíč v uvozovkách, ale bez hranatých závorek: {"mrkev" = 12} skončí chybou main.lua:1: '}' expected near '='.

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: 30

Ema 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: 51

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

1/10