Lua Academy · Lektion

Dyb og overfladisk kopiering

Implementér rekursiv dyb kopiering, og forstå referencesemantik.

Lektion 3 af 413 trin

Dyb og overfladisk kopiering er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Referencem semantik i Lua

I Lua kopierer tildeling af en tabel til en anden variabel referencen, ikke dataene. Begge variabler peger på den samme tabel.

local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1])  -- 99, a is affected!

Overfladisk kopi

En overfladisk kopi opretter en ny tabel med de samme nøgler og værdier på øverste niveau. Indlejrede tabeller deles stadig.

local function shallowCopy(t)
  local copy = {}
  for k, v in pairs(t) do copy[k] = v end
  return copy
end

Begrænsning ved overfladisk kopi

Hvis du ændrer en indlejret tabel i en overfladisk kopi, påvirker det originalen.

local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1])  -- 99 (shared!)

Dyb kopi via rekursion

En dyb kopi duplikerer rekursivt alle indlejrede tabeller og bryder alle delte referencer.

local function deepCopy(orig)
  local copy
  if type(orig) == "table" then
    copy = {}
    for k, v in pairs(orig) do
      copy[deepCopy(k)] = deepCopy(v)
    end
    setmetatable(copy, getmetatable(orig))
  else
    copy = orig
  end
  return copy
end

Dyb kopi i praksis

Efter en dyb kopi påvirker ændringer af indlejrede tabeller i kopien ikke originalen.

local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1])  -- 1 (independent!)

Håndtering af cyklusser

En naiv dyb kopi mislykkes ved cykliske tabeller. Registrér besøgte tabeller i en memotabel for at håndtere cyklusser.

local function deepCopyMemo(orig, memo)
  memo = memo or {}
  if type(orig) ~= "table" then return orig end
  if memo[orig] then return memo[orig] end
  local copy = {}
  memo[orig] = copy
  for k, v in pairs(orig) do
    copy[deepCopyMemo(k, memo)] = deepCopyMemo(v, memo)
  end
  setmetatable(copy, getmetatable(orig))
  return copy
end

Kopiering af metatabeller

En dyb kopi bør også overføre metatabellen med setmetatable(copy, getmetatable(orig)) for at bevare OOP-funktionaliteten.

Overfladisk kopi med table.move

For sekventielle arrays kan du bruge table.move til hurtigt at oprette en overfladisk klon.

local function arrayCopy(t)
  return table.move(t, 1, #t, 1, {})
end

Hvornår skal de forskellige typer bruges?

  • Overfladisk: enkle flade tabeller, ydelseskritisk kloning.
  • Dyb: indlejrede strukturer, serialisering, uforanderlige snapshots.

Funktionsværdier

Funktioner kopieres aldrig – både overfladiske og dybe kopier deler den samme funktionsreference. Dette er normalt den ønskede adfærd.

Ydelsesovervejelser

Dyb kopiering er O(n) i antallet af noder. For meget store træer kan du i stedet overveje strukturel deling eller copy-on-write-mønstre.

Spørgsmål om kopityper

Hvad sker der, når du ændrer en indlejret tabel i kopien efter en overfladisk kopiering?

Opsummering: Dyb kontra overfladisk kopi

Overfladisk kopi duplikerer kun nøgler på øverste niveau; indlejrede tabeller deles. Dyb kopi duplikerer alt rekursivt. Håndtér cyklusser med en memotabel for at forhindre uendelig rekursion.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Dyb og overfladisk kopiering” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Dyb og overfladisk kopiering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Dyb og overfladisk kopiering”?

Implementér rekursiv dyb kopiering, og forstå referencesemantik. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Dyb og overfladisk kopiering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. table.sort med sammenligningsfunktioner
  2. table.concat og table.move
  3. Dyb og overfladisk kopiering
  4. Transformation af tabeller: map, filter, reduce
← Tilbage til Lua Academy