Vkládání a odebírání

Lua má skupinu funkcí pro práci se seznamy. Jejich názvy začínají table., stejně jako názvy matematických funkcí začínají math.. Nejčastěji budete používat dvě: table.insert a table.remove.

table.insert(seznam, hodnota) přidá hodnotu na konec seznamu. Dělá totéž co seznam[#seznam + 1] = hodnota, jen se to lépe čte. Se třemi hodnotami v závorkách, table.insert(seznam, pozice, hodnota), vloží hodnotu na danou pozici. Prvky od této pozice dál se posunou o jedno místo doprava, takže se jejich indexy zvětší o jedna:

local ukoly = {"nakrmit slepice", "zalít pole"}
table.insert(ukoly, "podojit Bellu")
table.insert(ukoly, 1, "pustit Rexe ven")
print(#ukoly)
print(ukoly[1])
print(ukoly[2])
print(ukoly[4])

Vypíše:

4
pustit Rexe ven
nakrmit slepice
podojit Bellu

Pozice se píše před hodnotu. Když je prohodíte, třeba table.insert(ukoly, "podojit Bellu", 1), program se zastaví s chybou bad argument #2 to 'insert' (number expected, got string): druhá hodnota v závorkách (druhý argument) měla být číslo. Pozice také musí být mezi 1 a #ukoly + 1. Cokoli jiného, třeba table.insert(ukoly, 10, "odpočinout si"), skončí chybou bad argument #2 to 'insert' (position out of bounds). Díky tomu table.insert nikdy nenechá v seznamu díru.

table.remove(seznam) odebere poslední prvek a table.remove(seznam, pozice) prvek na dané pozici. Prvky za ním se posunou o jedno místo doleva, takže žádná díra nevznikne. Obě podoby vám navíc odebraný prvek dají zpátky. Říká se, že ho vracejí, stejně jako math.floor vrací zaokrouhlené číslo. Můžete si ho uložit do proměnné:

local ukoly = {"pustit Rexe ven", "nakrmit slepice", "podojit Bellu", "zalít pole"}
local hotovo = table.remove(ukoly, 1)
print("Hotovo: " .. hotovo)
print("Další: " .. ukoly[1])
local pozdeji = table.remove(ukoly)
print("Zítra: " .. pozdeji)
print("Zbývá: " .. #ukoly)

Vypíše:

Hotovo: pustit Rexe ven
Další: nakrmit slepice
Zítra: zalít pole
Zbývá: 2

Po prvním table.remove se "nakrmit slepice" posunulo z indexu 2 na index 1. Když odebraný prvek nepotřebujete, napište prostě table.remove(ukoly, 1) na samostatný řádek. Odebírání z prázdného seznamu není chyba: nic se neodebere a dostanete zpátky nil.

Porovnejte to s ukoly[1] = nil. To jen vyprázdní první místo a na začátku seznamu nechá díru: ukoly[1] je pak nil a "Další: " .. ukoly[1] skončí chybou attempt to concatenate a nil value. Prvky odebírejte pomocí table.remove.

Pokyny

Rex škrábe na dveře. Pod print vložte pomocí table.insert úkol "pustit Rexe ven" na začátek seznamu, na pozici 1.

Děda Josef poprosil Emu, aby mu pomohla s plotem. Přidejte pomocí table.insert na konec seznamu úkol "pomoct dědovi Josefovi".

Ema už Rexe pustila ven. Odeberte pomocí table.remove první úkol ze seznamu, uložte ho do lokální proměnné hotovo a vypište ho: Hotovo: pustit Rexe ven.

Nakonec vypište počet úkolů, první úkol a poslední úkol:

Úkoly: 4
První: nakrmit slepice
Poslední: pomoct dědovi Josefovi

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

4/11