0Pricing
Lua Academy · Pelajaran

Finalizer dengan __gc

Daftarkan metamethod __gc untuk pembersihan saat objek dikumpulkan.

Finalizer dengan __gc adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 Finalizer?

Finalizer adalah fungsi yang dipanggil oleh GC tepat sebelum objek dibebaskan. Dalam Lua, finalizer diterapkan melalui metamethod __gc pada metatabel suatu tabel.

Menetapkan Finalizer

Pasang fungsi __gc ke metatabel sebelum atau saat objek dibuat.

local mt = {
  __gc = function(self)
    print("Finalizing:", self.name)
  end
}
do
  local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage()  -- prints: Finalizing: resource

Pola Pembersihan Sumber Daya

Finalizer ideal untuk melepaskan sumber daya eksternal: handle file, koneksi basis data, atau memori C.

local function openResource(path)
  local f = io.open(path, "r")
  return setmetatable({handle = f, path = path}, {
    __gc = function(self)
      if self.handle then
        self.handle:close()
        print("Closed:", self.path)
      end
    end
  })
end

Urutan Finalizer

Objek dengan finalizer dikumpulkan dalam urutan terbalik dari pembuatannya. Secara bawaan, finalizer dijalankan satu per siklus GC.

Kebangkitan Kembali

Jika finalizer menyimpan referensi ke objek (dalam global atau upvalue), objek tersebut dibangkitkan kembali. Objek itu hanya akan menerima satu pemanggilan finalizer lagi saat akhirnya dikumpulkan.

Userdata dan __gc

Dalam ekstensi C, __gc pada userdata adalah cara utama untuk membebaskan memori C. Untuk kode Lua murni, tabel menggunakan mekanisme yang sama melalui metatabel.

Objek Proksi untuk RAII

Buat tabel proksi yang __gc-nya menutup sumber daya sebenarnya. Ini meniru RAII dari C++.

local function scoped(resource, cleanup)
  return setmetatable({resource}, {
    __gc = function(self) cleanup(self[1]) end
  })
end

Keterbatasan Finalizer

Finalizer tidak boleh: memanggil operasi coroutine, melakukan yield, atau mengasumsikan urutan objek lain tetap hidup. Buatlah finalizer sederhana dan singkat.

Tabel Weak dan Finalizer

Objek dalam tabel weak tetap dapat menjalankan finalizer. Setelah finalisasi (dan kemungkinan resurrection), objek tersebut akan sepenuhnya dikumpulkan pada siklus berikutnya.

Pelindung Finalizer toLua

Gunakan flag boolean di dalam finalizer untuk mencegah pembersihan ganda jika terjadi resurrection.

local mt = {}
mt.__gc = function(self)
  if not self._closed then
    self._closed = true
    -- cleanup...
  end
end

Saran Praktis

Utamakan metode :close() atau :destroy() yang dipanggil secara eksplisit untuk pembersihan deterministik. Gunakan __gc sebagai pengaman jika ada pembersihan yang tidak sengaja terlewat, bukan sebagai pengelolaan sumber daya utama.

Pertanyaan tentang Finalizer

Kapan metamethod __gc dipanggil?

Ringkasan: Finalizer dengan __gc

Metamethod __gc berjalan tepat sebelum objek dikumpulkan, sehingga memungkinkan pembersihan sumber daya bergaya RAII. Gunakan ini sebagai pengaman; utamakan metode close/destroy yang dipanggil secara eksplisit untuk pengelolaan sumber daya deterministik.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Finalizer dengan __gc” gratis?

Ya — teks lengkap “Finalizer dengan __gc” 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 “Finalizer dengan __gc”?

Daftarkan metamethod __gc untuk pembersihan saat objek dikumpulkan. 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 3 dari 4.

Berapa lama pelajaran “Finalizer dengan __gc” 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