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
endLimitaçã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
endCó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
endCopiando 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, {})
endQuando 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
- table.sort com comparadores
- table.concat e table.move
- Cópia profunda e cópia superficial
- Transformando tabelas: map, filter, reduce