0Pricing
Lua Academy · Aula

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]
end

Apó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
end

Padrã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
end

Limitaçõ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

  1. Noções básicas do coletor de lixo do Lua
  2. Chaves e valores fracos
  3. Finalizadores com __gc
  4. Evitando vazamentos de memória
← Voltar para Lua Academy