0Pricing
Lua Academy · Pelajaran

Kunci Lemah dan Nilai Lemah

Buat tabel lemah dengan __mode='k', 'v', atau 'kv' untuk struktur seperti cache.

Kunci Lemah dan Nilai Lemah adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Apa Itu Tabel Lemah?

Tabel lemah menyimpan referensi yang tidak mencegah pengumpulan sampah. Objek dalam tabel lemah dapat dikumpulkan meskipun tabelnya masih ada.

Metamethod __mode

Atur __mode pada metatabel untuk mengendalikan kelemahan: "k" untuk kunci lemah, "v" untuk nilai lemah, dan "kv" untuk keduanya.

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

Contoh Nilai Lemah

Cache yang nilainya dapat dikumpulkan saat tidak ada referensi lain.

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

Setelah GC, Nilai Lemah Menghilang

Setelah satu-satunya referensi ke suatu objek berada dalam tabel bernilai lemah, GC akan mengumpulkannya dan entri tersebut menghilang.

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

Contoh Kunci Lemah

Kunci lemah memungkinkan Anda mengaitkan metadata dengan objek tanpa mencegah pengumpulannya. Saat objek kunci dikumpulkan, entri tersebut dihapus.

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

Pola Anotasi Objek

Anotasi objek dengan data tambahan menggunakan tabel berkunci lemah. Saat objek dikumpulkan oleh GC, anotasinya otomatis dihapus.

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

Tabel Kunci dan Nilai Lemah

Tabel "kv" memiliki kunci dan nilai yang sama-sama lemah. Hanya kunci yang masih hidup (direferensikan di tempat lain) yang mempertahankan entrinya.

Tabel Ephemeron

Dalam Lua 5.2+, tabel berkunci lemah adalah ephemeron: jika satu-satunya referensi ke nilai berasal dari kunci, keduanya dikumpulkan bersama. Hal ini mencegah penyimpanan yang tidak diharapkan.

Pola Cache dengan Nilai Lemah

Penggunaan utamanya: cache memoization yang melepaskan hasil cache saat memori diperlukan, tanpa penghapusan 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

Keterbatasan

Tabel lemah tidak dapat menyimpan tipe primitif (angka, boolean, string) sebagai nilai lemah — tipe tersebut tidak dapat dikumpulkan oleh GC (string diinternalkan).

Kapan Menggunakan Tabel Lemah

  • Cache objek yang seharusnya melepaskan memori saat terjadi tekanan.
  • Mengaitkan metadata dengan objek eksternal.
  • Menerapkan tabel intern untuk objek khusus.

Pertanyaan tentang Tabel Lemah

Apa fungsi __mode = "v" pada metatabel?

Ringkasan: Kunci dan Nilai Lemah

Tabel lemah menggunakan __mode = "k", "v", atau "kv" agar GC dapat mengumpulkan kunci/nilainya. Ini penting untuk cache yang aman bagi memori dan pola anotasi objek.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kunci Lemah dan Nilai Lemah” gratis?

Ya — teks lengkap “Kunci Lemah dan Nilai Lemah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kunci Lemah dan Nilai Lemah”?

Buat tabel lemah dengan __mode='k', 'v', atau 'kv' untuk struktur seperti cache. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Kunci Lemah dan Nilai Lemah” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Pengumpul Sampah Lua
  2. Kunci Lemah dan Nilai Lemah
  3. Finalizer dengan __gc
  4. Menghindari Kebocoran Memori
← Kembali ke Lua Academy