0Pricing
Lua Academy · Aula

Cópia profunda e cópia superficial

Implemente cópias profundas recursivas e compreenda a semântica de referências.

Cópia profunda e cópia superficial é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

Semântica de Referência em Lua

Em Lua, atribuir uma tabela a outra variável copia a referência, não os dados. Ambas as variáveis apontam para a mesma tabela.

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

Cópia Superficial

Uma cópia superficial cria uma tabela nova com as mesmas chaves e valores do nível superior. As tabelas aninhadas continuam compartilhadas.

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

Limitação da Cópia Superficial

Modificar uma tabela aninhada em uma cópia superficial afeta a original.

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

Cópia Profunda por Recursão

Uma cópia profunda duplica recursivamente todas as tabelas aninhadas, desfazendo todas as referências compartilhadas.

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

Cópia Profunda em Ação

Após uma cópia profunda, modificar tabelas aninhadas na cópia não altera a original.

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

Lidando com Ciclos

A cópia profunda ingênua falha com tabelas cíclicas. Registre as tabelas visitadas em uma tabela de memória para lidar com ciclos.

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

Copiando Metatabelas

A cópia profunda também deve transferir a metatabela com setmetatable(copy, getmetatable(orig)) para preservar o comportamento de OOP.

Cópia Superficial com table.move

Para matrizes sequenciais, um clone superficial rápido usa table.move.

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

Quando Usar Cada Tipo

  • Superficial: tabelas simples e sem aninhamento; clonagem crítica para o desempenho.
  • Profunda: estruturas aninhadas, serialização e instantâneos imutáveis.

Valores de Função

Funções nunca são copiadas — tanto a cópia superficial quanto a profunda compartilham a mesma referência de função. Esse geralmente é o comportamento desejado.

Considerações de Desempenho

A cópia profunda é O(n) em relação ao número de nós. Para árvores muito grandes, considere padrões de compartilhamento estrutural ou de cópia na escrita.

Pergunta sobre Tipos de Cópia

Após uma cópia superficial, o que acontece quando você modifica uma tabela aninhada na cópia?

Recapitulação: Cópia Profunda vs. Superficial

A cópia superficial duplica apenas as chaves do nível superior; as tabelas aninhadas são compartilhadas. A cópia profunda duplica tudo recursivamente. Lide com ciclos usando uma tabela de memória para evitar recursão infinita.

Perguntas Frequentes

A aula “Cópia profunda e cópia superficial” é grátis?

Sim — o texto completo de “Cópia profunda e cópia superficial” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Cópia profunda e cópia superficial”?

Implemente cópias profundas recursivas e compreenda a semântica de referências. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Cópia profunda e cópia superficial”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. table.sort com comparadores
  2. table.concat e table.move
  3. Cópia profunda e cópia superficial
  4. Transformando tabelas: map, filter, reduce
← Voltar para Lua Academy