__gc ile Sonlandırıcılar
Nesneler toplandığında temizleme yapmak için __gc üst yöntemlerini kaydedin.
__gc ile Sonlandırıcılar, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Sonlandırıcı Nedir?
Sonlandırıcı, bir nesne serbest bırakılmadan hemen önce GC tarafından çağrılan bir işlevdir. Lua'da bir tablonun metatablosundaki __gc metamethod'u aracılığıyla uygulanır.
Sonlandırıcı Ayarlama
Bir metatabloya, nesne oluşturulmadan önce veya oluşturulurken __gc işlevi ekleyin.
local mt = {
__gc = function(self)
print("Finalizing:", self.name)
end
}
do
local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage() -- prints: Finalizing: resourceKaynak Temizleme Deseni
Sonlandırıcılar harici kaynakları (dosya tanıtıcıları, veritabanı bağlantıları veya C belleği) serbest bırakmak için idealdir.
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
})
endSonlandırıcı Sırası
Sonlandırıcısı olan nesneler oluşturulma sıralarının tersine toplanır. Sonlandırıcılar varsayılan olarak her GC döngüsünde birer tane çalışır.
Yeniden Canlandırma
Bir sonlandırıcı nesneye yönelik bir başvuruyu (global bir değişkende veya üst değer içinde) saklarsa nesne yeniden canlandırılır. Nesne nihayet toplandığında yalnızca bir kez daha sonlandırıcı çağrısı alır.
Kullanıcı Verisi ve __gc
C uzantılarında kullanıcı verileri üzerindeki __gc, C belleğini serbest bırakmanın temel yoludur. Saf Lua kodunda tablolar, metatablolar aracılığıyla aynı mekanizmayı kullanır.
RAII için Vekil Nesneler
__gc işlevi gerçek kaynağı kapatan bir vekil tablo oluşturun. Bu, C++ dilindeki RAII davranışını taklit eder.
local function scoped(resource, cleanup)
return setmetatable({resource}, {
__gc = function(self) cleanup(self[1]) end
})
endSonlandırıcıların Sınırlamaları
Sonlandırıcılar şunları yapmamalıdır: eş yordam işlemlerini çağırmak, askıya almak veya diğer nesnelerin hayatta olma sırasını varsaymak. Sonlandırıcıları basit ve kısa tutun.
Zayıf Tablolar ve Sonlandırıcılar
Zayıf tablolardaki nesneler yine de sonlandırılabilir. Sonlandırmadan (ve olası yeniden canlandırmadan) sonra, bir sonraki döngüde tamamen toplanırlar.
toLua Sonlandırıcı Koruması
Yeniden canlandırma durumunda iki kez temizlemeyi önlemek için sonlandırıcının içinde bir boole bayrağı kullanın.
local mt = {}
mt.__gc = function(self)
if not self._closed then
self._closed = true
-- cleanup...
end
endPratik Öneriler
Belirli ve öngörülebilir bir temizleme için açıkça belirtilen :close() veya :destroy() yöntemlerini tercih edin. __gc özelliğini birincil kaynak yönetimi olarak değil, yanlışlıkla atlanan temizlemelere karşı güvenlik ağı olarak kullanın.
Sonlandırıcı Sorusu
__gc metamethod'u ne zaman çağrılır?
Özet: __gc ile Sonlandırıcılar
__gc metamethod'u, bir nesne toplanmadan hemen önce çalışarak RAII tarzı kaynak temizlemeyi mümkün kılar. Bunu bir güvenlik ağı olarak kullanın; belirli ve öngörülebilir kaynak yönetimi için açıkça belirtilen kapatma/yok etme yöntemlerini tercih edin.
Sıkça Sorulan Sorular
“__gc ile Sonlandırıcılar” dersi ücretsiz mi?
Evet — “__gc ile Sonlandırıcılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“__gc ile Sonlandırıcılar” dersinde ne öğreneceğim?
Nesneler toplandığında temizleme yapmak için __gc üst yöntemlerini kaydedin. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“__gc ile Sonlandırıcılar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Lua Çöp Toplayıcısına Giriş
- Zayıf Anahtarlar ve Zayıf Değerler
- __gc ile Sonlandırıcılar
- Bellek Sızıntılarından Kaçınma