Vytvoření seznamu
V lekci o cyklech jste se naučili opakovat kód. V této lekci se naučíte uložit mnoho hodnot pod jeden název.
Ema pěstuje na farmě Slunečnice několik plodin. S tím, co zatím znáte, byste pro každou z nich potřebovali jednu proměnnou:
local plodina1 = "mrkev"
local plodina2 = "brambory"
local plodina3 = "dýně"To je spousta psaní a cyklus je navíc projít nemůže: plodina1 a plodina2 jsou prostě dva názvy, které spolu nijak nesouvisejí. Lua na to má lepší nástroj: tabulku. Tabulce, která drží hodnoty v pořadí, jednu za druhou, se říká seznam. Hodnoty seznamu napíšete do složených závorek a oddělíte je čárkami:
local plodiny = {"mrkev", "brambory", "dýně"}Hodnotám v seznamu se říká prvky. Tento seznam má tři prvky v pevném pořadí: "mrkev" je první, "dýně" poslední. Tabulky jsou v Lua jediný způsob, jak hodnoty seskupit. V této lekci v nich budou seznamy, v dalších lekcích stejné tabulky poslouží jako slovníky, a dokonce jako objekty.
Každý prvek má svou pozici, které se říká index. V Lua se indexy počítají od 1: první prvek má index 1, druhý index 2 a tak dále. Prvek přečtete tak, že za název seznamu napíšete do hranatých závorek jeho index:
local plodiny = {"mrkev", "brambory", "dýně"}
print(plodiny[1])
print(plodiny[3])Vypíše:
mrkev
dýněTakhle k sobě patří prvky a jejich indexy:
plodiny: | "mrkev" | "brambory" | "dýně" |
index: 1 2 3Většina jiných programovacích jazyků (Python, JavaScript, C…) počítá indexy od 0. Lua počítá od 1, stejně jako lidé, když něco počítají. Jestli se jednou budete učit jiný jazyk, dejte si na tento rozdíl pozor.
Co se stane s indexem, na kterém žádný prvek není, třeba 0 nebo 4? Mnoho jazyků program zastaví s chybou. Lua ne: dostanete prostě nil, hodnotu, která znamená „nic“:
local plodiny = {"mrkev", "brambory", "dýně"}
print(plodiny[0], plodiny[4])Vypíše:
nil nilPotíže způsobí nil až později, když ho použijete. Když ho třeba připojíte k textu, program skončí chybou:
local plodiny = {"mrkev", "brambory", "dýně"}
print("Plodina: " .. plodiny[4])main.lua:2: attempt to concatenate a nil value (field 'integer index')Hláška říká, že jste se pokusili připojit (concatenate) hodnotu nil a že pochází z tabulky: field je v Lua místo v tabulce a tohle mělo jako index celé číslo (integer index). Když takovou chybu uvidíte, zkontrolujte index.
Prvky mohou být i čísla a seznam může být také prázdný: {}. Jak prázdný seznam naplnit, se dozvíte dále v této lekci. Prvek přečtený ze seznamu je obyčejná hodnota, takže s ním můžete počítat nebo ho připojit k textu:
local vejce = {4, 6, 5}
print(vejce[1] + vejce[2])
print("Vejce dnes: " .. vejce[3])Vypíše:
10
Vejce dnes: 5Jak psát:
Pokyny
Program má vypsat Eminu první plodinu, ale když ho spustíte, skončí chybou: main.lua:3: attempt to concatenate a nil value (field 'integer index'). Opravte index tak, aby program vypsal První plodina: mrkev.
Pod to stejným způsobem vypište poslední, tedy čtvrtou plodinu: Poslední plodina: jahody.
Pod výpisy vytvořte lokální proměnnou vejce se seznamem počtů vajec, která Eminy slepice snesly v posledních třech dnech: 4, 6 a 5, v tomto pořadí.
Vypište, kolik vajec slepice snesly za tři dny dohromady. Tři prvky seznamu vejce sečtěte v kódu, číslo nepočítejte sami: Vajec celkem: 15.
Začněte programovat zdarma
1/11