Sdílené tabulky

U čísel a textů = hodnotu zkopíruje. Po local b = a změna b proměnnou a nezmění:

local a = 5
local b = a
b = b + 1
print(a, b)
5	6

Tabulky se chovají jinak. Proměnná nedrží samotnou tabulku, jen odkaz na ni: něco jako adresu tabulky v paměti počítače. To je to 0x…, které vypíše print(t). local b = a zkopíruje odkaz, ne tabulku, takže obě proměnné vedou ke stejné tabulce:

local ceny = {mrkev = 5, brambory = 8}
local cenyJosef = ceny

cenyJosef.mrkev = 6
print(ceny.mrkev)
print(ceny == cenyJosef)
6
true

Děda Josef změnil „svou“ cenu a Emina se změnila také, protože je to jedna tabulka se dvěma jmény. A == se u tabulek ptá, jestli jde o tutéž tabulku, ne jestli mají dvě tabulky stejný obsah. Každé {} vytvoří novou tabulku, takže:

print({} == {})
print({mrkev = 5} == {mrkev = 5})
false
false

Když chcete porovnat obsah dvou tabulek, porovnejte jejich klíče a hodnoty sami, třeba v cyklu.

Totéž se děje, když tabulku předáte funkci. Parametr ukazuje na stejnou tabulku, takže ji funkce může změnit a změna je vidět i venku. To často chcete; taková funkce dokonce nemusí nic vracet:

local function sklid(stodola, plodina, pocet)
    stodola[plodina] = (stodola[plodina] or 0) + pocet
end

local stodola = {}
sklid(stodola, "mrkev", 12)
sklid(stodola, "mrkev", 3)
print(stodola.mrkev)
15

Když chcete samostatnou tabulku, musíte ji zkopírovat: vytvořit novou a pomocí pairs do ní přenést každý klíč a hodnotu:

local function kopie(t)
    local vysledek = {}
    for klic, hodnota in pairs(t) do
        vysledek[klic] = hodnota
    end
    return vysledek
end

local ceny = {mrkev = 5, brambory = 8}
local cenyJosef = kopie(ceny)

cenyJosef.mrkev = 6
print(ceny.mrkev, cenyJosef.mrkev)
print(ceny == cenyJosef)
5	6
false

Funkce funguje i pro seznamy, protože pairs prochází i klíče 1, 2, 3… Kopíruje ale jen jednu úroveň: když je hodnotou další tabulka, jako stodola ve farma.stodola, dostane kopie odkaz na tutéž vnitřní tabulku.

Pokyny

Spusťte program: Eminy ceny se změnily také, protože cenyHugo je tatáž tabulka jako ceny. Napište funkci kopie(t), která vrátí novou tabulku se stejnými klíči a hodnotami, a vytvořte cenyHugo jako kopii tabulky ceny. Program pak vypíše:

Ema: mrkev 5, brambory 8, dýně 20
Hugo: mrkev 7, brambory 8, dýně 25

Na konci programu napište funkci zdraz(t, castka), která každou cenu v tabulce, kterou dostane, zvýší o částku z parametru castka: tu tabulku změní a nic nevrací. Zdražte Hugovy ceny o 1 a znovu ukažte oba ceníky:

Ema: mrkev 5, brambory 8, dýně 20
Hugo: mrkev 8, brambory 9, dýně 26

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

9/10