Vnořené tabulky

Hodnotou v tabulce může být další tabulka a v té můžou být další tabulky. Tak popíšete něco většího, třeba celou farmu:

local farma = {
    nazev = "farma Slunečnice",
    mince = 120,
    stodola = {vejce = 18, mleko = 6},
    pole = {"mrkev", "brambory", "dýně"},
}

print(farma.stodola.vejce)
print(farma.pole[2])
print(#farma.pole)

Vypíše:

18
brambory
3

farma.stodola.vejce čtěte zleva doprava: farma.stodola je tabulka stodoly a .vejce z ní přečte klíč vejce. Tečky a hranaté závorky můžete řetězit, jak daleko potřebujete: farma.pole[2] je druhý prvek seznamu v klíči pole. Hodnotu změníte stejně: farma.stodola.vejce = farma.stodola.vejce + 6.

Vnitřní tabulky můžou být slovníky, seznamy i záznamy, smíchané, jak se vám hodí. Tady je slovník záznamů, jeden pro každé zvíře:

local zvirata = {
    bella = {druh = "kráva", vek = 4},
    rex = {druh = "pes", vek = 2},
}

print(zvirata.bella.druh .. ", " .. zvirata.bella.vek .. " roky")
print(zvirata.rex.druh)
kráva, 4 roky
pes

Vnořovat jde i seznamy: pole se záhony po řádcích je seznam seznamů a zahony[2][3] je třetí záhon ve druhém řádku.

Typická chyba je čtení přes tabulku, která neexistuje. Řekněme, že Ema má nářadí v kůlně, ale farma ještě žádnou kůlnu nemá:

local farma = {nazev = "farma Slunečnice", stodola = {vejce = 18}}

print(farma.kulna.naradi)
main.lua:3: attempt to index a nil value (field 'kulna')

Index tu znamená přístup ke klíči tabulky pomocí tečky nebo hranatých závorek. farma.kulna je nil a z nil klíč naradi přečíst nejde. Hláška jmenuje klíč, který byl nil, tedy 'kulna': problém je v části před poslední tečkou, ne v naradi. Stejná chyba přijde i při přiřazení farma.kulna.naradi = 4: vnitřní tabulku za vás Lua nevytvoří. Vytvořte ji nejdřív sami:

local farma = {nazev = "farma Slunečnice", stodola = {vejce = 18}}

farma.kulna = {}
farma.kulna.naradi = 4
print(farma.kulna.naradi)
4

Nebo v jednom kroku: farma.kulna = {naradi = 4}. Když si nejste jistí, jestli vnitřní tabulka existuje, nejdřív to ověřte: if farma.kulna then … end, nebo v jednom výrazu farma.kulna and farma.kulna.naradi, což je bez kůlny nil místo chyby.

Pokyny

Program skončí chybou: farma sama žádné mléko nemá, mléko je ve stodole. Opravte print, aby vypsal:

Mléko: 6 litrů

Na farmu přibyla slepice Kropenka. Pod print ji pomocí table.insert přidejte do seznamu farma.zvirata jako záznam se jménem "Kropenka" a druhem "slepice". Pak seznam projděte pomocí ipairs a vypište každé zvíře:

kráva Bella
pes Rex
slepice Kropenka

Ema postavila kůlnu na své 4 kusy nářadí. Na konci programu přidejte do tabulky farma klíč kulna s tabulkou, která má klíč naradi s hodnotou 4. Pak vypište, s číslem přečteným pomocí farma.kulna.naradi:

Nářadí: 4

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

8/10