Klíče v proměnných
Klíč v hranatých závorkách nemusíte psát přímo. Může být uložený v proměnné, nebo přijít jako parametr či z cyklu:
local ceny = {mrkev = 5, brambory = 8, jahody = 12}
local plodina = "brambory"
print(ceny[plodina])Vypíše:
8Lua se nejdřív podívá do proměnné plodina, najde v ní text "brambory" a pak přečte hodnotu s tímto klíčem. Tak napíšete kód pro klíč, který při psaní programu ještě neznáte: pro plodinu, na kterou se ptá zákazník, nebo pro každou plodinu ze seznamu.
A teď klasická chyba. Za tečkou je vždycky přímo název klíče, nikdy proměnná. ceny.plodina znamená ceny["plodina"]: klíčem je text "plodina" a takový klíč v tabulce není:
local ceny = {mrkev = 5, brambory = 8, jahody = 12}
local plodina = "brambory"
print(ceny.plodina)
print(ceny["plodina"])
print(ceny[plodina])Vypíše:
nil
nil
8Takže: když klíč znáte už při psaní kódu, použijte tečku (ceny.brambory). Když je klíč v proměnné, použijte hranaté závorky bez uvozovek (ceny[plodina]). S uvozovkami je to zase jen text: ceny["plodina"] je totéž co ceny.plodina.
Klíč v proměnné může být jakýkoli text, i s diakritikou. Nejvíc se hodí ve funkcích a cyklech. Tahle funkce funguje pro každou plodinu, i pro takovou, kterou do tabulky přidáte později:
local ceny = {mrkev = 5, brambory = 8, ["dýně"] = 20}
local function spocitejCenu(plodina, pocet)
return ceny[plodina] * pocet
end
print(spocitejCenu("mrkev", 3))
print(spocitejCenu("dýně", 2))Vypíše:
15
40Kdybyste v ní omylem napsali ceny.plodina * pocet, program by skončil chybou attempt to perform arithmetic on a nil value (field 'plodina'). Hláška jmenuje klíč, který Lua hledala, 'plodina': to je znamení, že jste napsali název proměnné místo její hodnoty. A když klíč z proměnné v tabulce není, je v hlášce místo názvu otazník, protože Lua neví, odkud se klíč vzal: spocitejCenu("kukuřice", 1) skončí chybou attempt to perform arithmetic on a nil value (field '?').
Ještě jedna drobnost: klíčem může být i číslo, a číslo je jiný klíč než text. t[1] a t["1"] jsou dva různé klíče.
Jak psát:
Pokyny
Program skončí chybou. Opravte funkci spocitejCenu, aby četla cenu plodiny, která je v parametru plodina. Program vypíše:
3 mrkve: 15 mincíZákazník přinesl seznam toho, co chce, objednavka: od každé plodiny jeden kus. Na konci programu ho projděte pomocí ipairs a u každé plodiny vypište její cenu. Kukuřici Ema na stánku neprodává (nechává ji slepicím), takže ceny klíč "kukuřice" nemají: u ní vypište kukuřice: neprodává se. Program vypíše:
dýně: 20
jahody: 12
kukuřice: neprodává se
mrkev: 5Pod cyklem vypište, kolik zákazník zaplatí za plodiny, které Ema prodává:
Celkem: 37 mincíZačněte programovat zdarma
3/10