0Pricing
Lua Academy · Lezione

Chiavi e valori deboli

Crei tabelle deboli con __mode='k', 'v' o 'kv' per strutture simili a cache.

Chiavi e valori deboli è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Che cosa sono le tabelle deboli?

Una tabella debole contiene riferimenti che non impediscono la garbage collection. Gli oggetti nelle tabelle deboli possono essere raccolti anche quando la tabella esiste ancora.

Il metametodo __mode

Impostate __mode nella metatabella per controllare la debolezza: "k" per chiavi deboli, "v" per valori deboli, "kv" per entrambi.

local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys   = setmetatable({}, {__mode = "k"})

Esempio di valori deboli

Una cache in cui i valori possono essere raccolti quando non esistono altri riferimenti.

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

Dopo il GC, i valori deboli scompaiono

Quando l'unico riferimento a un oggetto si trova in una tabella con valori deboli, il GC lo raccoglie e la voce scompare.

local t = setmetatable({}, {__mode = "v"})
do
  local obj = {}
  t[1] = obj
  print(t[1])  -- table: 0x...
end
collectgarbage()
print(t[1])  -- nil (collected)

Esempio di chiavi deboli

Le chiavi deboli consentono di associare metadati agli oggetti senza impedirne la raccolta. Quando l'oggetto chiave viene raccolto, la voce viene rimossa.

local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
  meta[obj] = data
end

Pattern per annotare gli oggetti

Annotate gli oggetti con dati aggiuntivi usando una tabella con chiavi deboli. Quando l'oggetto viene raccolto dal GC, l'annotazione viene rimossa automaticamente.

local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)

Tabelle con chiavi e valori deboli

Una tabella "kv" ha chiavi e valori deboli. Solo le chiavi ancora vive (referenziate altrove) mantengono le proprie voci.

Tabelle ephemeron

In Lua 5.2 e versioni successive, le tabelle con chiavi deboli sono ephemeron: se l'unico riferimento al valore passa attraverso la chiave, entrambi vengono raccolti insieme. Questo impedisce una conservazione imprevista degli oggetti.

Pattern di cache con valori deboli

L'uso canonico è una cache di memoization che rilascia i risultati memorizzati quando serve memoria, senza richiedere l'eliminazione manuale.

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

Limitazioni

Le tabelle deboli non possono contenere tipi primitivi (numeri, booleani, stringhe) come valori deboli: non possono essere raccolti dal GC (le stringhe sono internate).

Quando usare le tabelle deboli

  • Cache di oggetti che devono rilasciare memoria sotto pressione.
  • Associazione di metadati a oggetti esterni.
  • Implementazione di tabelle intern per oggetti personalizzati.

Domanda sulle tabelle deboli

Che cosa fa __mode = "v" su una metatabella?

Riepilogo: chiavi e valori deboli

Le tabelle deboli usano __mode = "k", "v" o "kv" per consentire al GC di raccogliere le chiavi o i valori. Sono essenziali per cache efficienti nell'uso della memoria e per i pattern di annotazione degli oggetti.

Domande Frequenti

La lezione «Chiavi e valori deboli» è gratuita?

Sì — il testo completo di «Chiavi e valori deboli» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Chiavi e valori deboli»?

Crei tabelle deboli con __mode='k', 'v' o 'kv' per strutture simili a cache. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Chiavi e valori deboli»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Nozioni di base sul garbage collector di Lua
  2. Chiavi e valori deboli
  3. Finalizzatori con __gc
  4. Prevenzione delle perdite di memoria
← Torna a Lua Academy