Výpis seznamu

Co se stane, když vypíšete celý seznam?

local plodiny = {"mrkev", "brambory", "dýně"}
print(plodiny)

Vypíše něco jako:

table: 0x109008

Místo prvků vypíše Lua typ table a číslo zapsané v šestnáctkové soustavě (s číslicemi 0 až 9 a písmeny a až f). Je to adresa tabulky, tedy místo v paměti počítače, kde tabulka je. Hodí se jen k rozlišení dvou tabulek a při každém spuštění programu může vyjít jinak. Ani připojení seznamu k textu nefunguje: "Plodiny: " .. plodiny skončí chybou attempt to concatenate a table value (local 'plodiny').

Prvky vypíšete tak, že je funkcí table.concat spojíte do jednoho textu. Prvním argumentem je seznam, druhým text, který se vloží mezi prvky, tedy oddělovač:

local plodiny = {"mrkev", "brambory", "dýně"}
print(table.concat(plodiny, ", "))
print("Plodiny: " .. table.concat(plodiny, ", "))
print(table.concat(plodiny, " | "))
print(table.concat(plodiny))

Vypíše:

mrkev, brambory, dýně
Plodiny: mrkev, brambory, dýně
mrkev | brambory | dýně
mrkevbramborydýně

Oddělovač se vkládá jen mezi prvky, ne za poslední. Bez oddělovače se prvky slepí dohromady. Výsledek je obyčejný text, takže ho můžete připojit k jiným textům nebo uložit do proměnné. Pro prázdný seznam dá table.concat prázdný text.

Prvky mohou být texty a čísla, nic jiného. U jakékoli jiné hodnoty, třeba true, chybová hláška řekne, který prvek je špatně:

print(table.concat({"mrkev", true, "dýně"}, ", "))
main.lua:1: invalid value (boolean) at index 2 in table for 'concat'

Někdy potřebujete víc než samotné prvky, třeba počet dní růstu u každé plodiny. Pak v cyklu sestavte nový seznam textů a ten na konci spojte:

local plodiny = {"mrkev", "brambory", "dýně"}
local dny = {3, 4, 7}
local popisky = {}
for i, plodina in ipairs(plodiny) do
    popisky[#popisky + 1] = plodina .. " (dny: " .. dny[i] .. ")"
end
print(table.concat(popisky, ", "))

Vypíše:

mrkev (dny: 3), brambory (dny: 4), dýně (dny: 7)

Prvky můžete vypsat i v cyklu pomocí io.write, jako v lekci o cyklech. Pak se ale o oddělovač musíte postarat sami: patří před každý prvek kromě prvního.

local plodiny = {"mrkev", "brambory", "dýně"}
for i, plodina in ipairs(plodiny) do
    if i > 1 then
        io.write(", ")
    end
    io.write(plodina)
end
print()

Vypíše:

mrkev, brambory, dýně

print() na konci ukončí řádek. table.concat tohle všechno zvládne na jednom řádku.

Pokyny

Spusťte program: vypíše adresu tabulky, ne zboží. Změňte poslední řádek tak, aby vypsal zboží pomocí table.concat: Na prodej: mrkev, brambory, dýně, vejce.

Pod něj vytvořte prázdný lokální seznam popisky. Pak v cyklu projděte zbozi a pro každý prvek přidejte na konec seznamu popisky text jako mrkev (12): zboží, mezeru a množství ze seznamu mnozstvi v závorkách.

Za cyklem vypište popisky pomocí table.concat: Dnes: mrkev (12), brambory (8), dýně (3), vejce (30).

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

7/11