المنهيات باستخدام __gc
سجّل طرقًا وصفية __gc لتنظيف الموارد عند جمع الكائنات
المنهيات باستخدام __gc درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
ما هي المنهية؟
المنهية دالة يستدعيها GC قبل تحرير الكائن مباشرةً. وتُنفَّذ في Lua باستخدام طريقة metamethod __gc في جدول metamethod الخاص بالجدول.
ضبط منهية
أرفقوا دالة __gc بجدول metamethod قبل إنشاء الكائن أو عند إنشائه.
local mt = {
__gc = function(self)
print("Finalizing:", self.name)
end
}
do
local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage() -- prints: Finalizing: resourceنمط تنظيف الموارد
تُعدّ المنهيات مثالية لتحرير الموارد الخارجية: مقابض الملفات، أو اتصالات قواعد البيانات، أو ذاكرة 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ترتيب المنهيات
تُجمع الكائنات ذات المنهيات بترتيب عكسي لترتيب إنشائها. وتُشغَّل المنهيات واحدةً في كل دورة GC افتراضيًا.
إحياء الكائن
إذا خزّنت المنهية مرجعًا إلى الكائن (في متغير عام أو upvalue)، فسيُعاد إحياء الكائن. ولن يحصل إلا على استدعاء منهية إضافي واحد عند جمعه نهائيًا.
Userdata و__gc
في امتدادات C، تُعدّ __gc على Userdata الطريقة الأساسية لتحرير ذاكرة C. أما في Lua الخالصة، فتستخدم الجداول الآلية نفسها عبر جداول metamethod.
كائنات الوكيل لـ RAII
أنشئوا جدول وكيل تغلق طريقة __gc فيه المورد الحقيقي. وهذا يحاكي RAII في C++.
local function scoped(resource, cleanup)
return setmetatable({resource}, {
__gc = function(self) cleanup(self[1]) end
})
endقيود أدوات الإنهاء
يجب ألا تقوم أدوات الإنهاء بما يلي: استدعاء عمليات coroutine أو استخدام yield أو افتراض أي ترتيب لبقاء الكائنات الأخرى. احرصوا على أن تكون بسيطة وقصيرة.
الجداول الضعيفة وأدوات الإنهاء
يمكن أن تخضع الكائنات الموجودة في الجداول الضعيفة للإنهاء أيضًا. بعد الإنهاء (ومع احتمال إعادة إحيائها)، تُجمع نهائيًا في دورة GC التالية.
حارس أداة إنهاء toLua
استخدموا علامة منطقية داخل أداة الإنهاء لمنع إجراء التنظيف مرتين في حال إعادة إحياء الكائن.
local mt = {}
mt.__gc = function(self)
if not self._closed then
self._closed = true
-- cleanup...
end
endنصيحة عملية
فضّلوا استخدام الطريقتين الصريحتين :close() أو :destroy() لإجراء تنظيف حتمي. استخدموا __gc كشبكة أمان لحالات السهو غير المقصود، وليس كآلية أساسية لإدارة الموارد.
سؤال حول أدوات الإنهاء
متى تُستدعى طريقة metamethod __gc؟
مراجعة: أدوات الإنهاء مع __gc
تعمل طريقة metamethod __gc قبل جمع الكائن مباشرة، مما يتيح تنظيف الموارد بأسلوب RAII. استخدموها كشبكة أمان، وفضّلوا طريقتي close/destroy الصريحتين لإدارة الموارد بشكل حتمي.
الأسئلة الشائعة
هل درس «المنهيات باستخدام __gc» مجاني؟
نعم — نص درس «المنهيات باستخدام __gc» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «المنهيات باستخدام __gc»؟
سجّل طرقًا وصفية __gc لتنظيف الموارد عند جمع الكائنات تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «المنهيات باستخدام __gc»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات جامع البيانات المهملة في Lua
- المفاتيح والقيم الضعيفة
- المنهيات باستخدام __gc
- تجنّب تسرّبات الذاكرة