0Pricing
Lua Academy · درس

المفاتيح والقيم الضعيفة

أنشئ جداول ضعيفة باستخدام __mode='k' أو 'v' أو 'kv' لبُنى شبيهة بالتخزين المؤقت

المفاتيح والقيم الضعيفة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما هي الجداول الضعيفة؟

يحتفظ الجدول الضعيف بمراجع لا تمنع جمع القمامة. ويمكن جمع الكائنات الموجودة في الجداول الضعيفة حتى مع استمرار وجود الجدول.

طريقة metamethod ‏__mode

اضبطوا __mode في جدول metamethod للتحكم في الضعف: "k" للمفاتيح الضعيفة، و"v" للقيم الضعيفة، و"kv" لكليهما.

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

مثال على القيم الضعيفة

ذاكرة تخزين مؤقت يمكن جمع قيمها عندما لا توجد مراجع أخرى إليها.

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

اختفاء القيم الضعيفة بعد GC

بمجرد أن يصبح المرجع الوحيد إلى كائن موجودًا في جدول ذي قيم ضعيفة، سيجمعه GC ويختفي الإدخال.

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

مثال على المفاتيح الضعيفة

تتيح المفاتيح الضعيفة ربط بيانات وصفية بالكائنات دون منع جمعها. وعند جمع كائن المفتاح، يُزال الإدخال.

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

نمط إضافة التعليقات التوضيحية إلى الكائنات

أضيفوا بيانات إضافية إلى الكائنات باستخدام جدول ذي مفاتيح ضعيفة. وعند جمع الكائن بواسطة GC، تُزال التعليقات التوضيحية تلقائيًا.

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

المفاتيح الضعيفة وجداول القيم

يحتوي جدول "kv" على مفاتيح وقيم ضعيفة معًا. ولا تُبقي إدخالاته إلا المفاتيح الموجودة فعليًا (أي المشار إليها من مكان آخر).

جداول Ephemeron

في Lua 5.2 والإصدارات الأحدث، تكون الجداول ذات المفاتيح الضعيفة من نوع Ephemeron: فإذا كان المرجع الوحيد إلى القيمة يمر عبر المفتاح، يُجمع الاثنان معًا. ويمنع ذلك الاحتفاظ غير المتوقع بالكائنات.

نمط الذاكرة المؤقتة بالقيم الضعيفة

الاستخدام النموذجي: ذاكرة مؤقتة للحفظ المؤقت تطلق النتائج المخزنة عند الحاجة إلى الذاكرة، دون إزالة يدوية.

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

القيود

لا يمكن للجداول الضعيفة الاحتفاظ بالأنواع البدائية (الأرقام، والقيم المنطقية، والسلاسل النصية) كقيم ضعيفة، إذ لا يمكن لـ GC جمعها (والسلاسل النصية موحّدة).

متى تُستخدم الجداول الضعيفة؟

  • ذاكرات مؤقتة للكائنات ينبغي أن تطلق الذاكرة عند زيادة الضغط.
  • ربط البيانات الوصفية بالكائنات الخارجية.
  • تنفيذ جداول توحيد للكائنات المخصّصة.

سؤال حول الجداول الضعيفة

ماذا يفعل __mode = "v" في جدول metamethod؟

مراجعة: المفاتيح والقيم الضعيفة

تستخدم الجداول الضعيفة __mode = "k" أو "v" أو "kv" للسماح لـ GC بجمع مفاتيحها أو قيمها. وهذا ضروري للذاكرات المؤقتة الآمنة من ناحية الذاكرة وأنماط إضافة التعليقات التوضيحية إلى الكائنات.

الأسئلة الشائعة

هل درس «المفاتيح والقيم الضعيفة» مجاني؟

نعم — نص درس «المفاتيح والقيم الضعيفة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «المفاتيح والقيم الضعيفة»؟

أنشئ جداول ضعيفة باستخدام __mode='k' أو 'v' أو 'kv' لبُنى شبيهة بالتخزين المؤقت تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المفاتيح والقيم الضعيفة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات جامع البيانات المهملة في Lua
  2. المفاتيح والقيم الضعيفة
  3. المنهيات باستخدام __gc
  4. تجنّب تسرّبات الذاكرة
← العودة إلى Lua Academy