Chaves e valores fracos
Crie tabelas fracas com __mode='k', 'v' ou 'kv' para estruturas semelhantes a caches.
Chaves e valores fracos é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 2 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.
O que são tabelas fracas?
Uma tabela fraca mantém referências que não impedem a coleta de lixo. Os objetos em tabelas fracas podem ser coletados mesmo enquanto a tabela existir.
O metamétodo __mode
Defina __mode na metatabela para controlar a fraqueza: "k" para chaves fracas, "v" para valores fracos e "kv" para ambos.
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})Exemplo de valores fracos
Um cache cujos valores podem ser coletados quando não houver outras referências.
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
endApós a coleta de lixo, os valores fracos desaparecem
Quando a única referência a um objeto estiver em uma tabela de valores fracos, o coletor de lixo o coletará e a entrada desaparecerá.
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)Exemplo de chaves fracas
Chaves fracas permitem associar metadados a objetos sem impedir sua coleta. Quando o objeto usado como chave é coletado, a entrada é removida.
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
endPadrão de anotação de objetos
Anote objetos com dados adicionais usando uma tabela de chaves fracas. Quando o objeto for coletado, a anotação será removida automaticamente.
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)Tabelas de chaves e valores fracos
Uma tabela "kv" tem chaves e valores fracos. Somente as chaves que estão ativas (referenciadas em outro lugar) mantêm suas entradas.
Tabelas efêmeras
No Lua 5.2 ou posterior, tabelas de chaves fracas são efêmerons: se a única referência ao valor for feita por meio da chave, ambos serão coletados juntos. Isso evita retenções inesperadas.
Padrão de cache com valores fracos
O uso clássico: um cache de memorização que libera os resultados armazenados quando a memória é necessária, sem remoção manual.
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
endLimitações
Tabelas fracas não podem manter tipos primitivos (números, booleanos e cadeias de caracteres) como valores fracos — eles não podem ser coletados pelo coletor de lixo (as cadeias de caracteres são internadas).
Quando usar tabelas fracas
- Caches de objetos que devem liberar memória sob pressão.
- Associação de metadados a objetos externos.
- Implementação de tabelas de internamento para objetos personalizados.
Pergunta sobre tabelas fracas
O que __mode = "v" em uma metatabela faz?
Recapitulação: chaves e valores fracos
Tabelas fracas usam __mode = "k", "v" ou "kv" para permitir que o coletor de lixo colete suas chaves e valores. Isso é essencial para caches seguros quanto ao uso de memória e padrões de anotação de objetos.
Perguntas Frequentes
A aula “Chaves e valores fracos” é grátis?
Sim — o texto completo de “Chaves e valores fracos” é 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 “Chaves e valores fracos”?
Crie tabelas fracas com __mode='k', 'v' ou 'kv' para estruturas semelhantes a caches. 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 2 de 4.
Quanto tempo leva a aula “Chaves e valores fracos”?
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
- Noções básicas do coletor de lixo do Lua
- Chaves e valores fracos
- Finalizadores com __gc
- Evitando vazamentos de memória