مشاركة Upvalues بين الإغلاقات
تعرّف إلى مشاركة عدة إغلاقات لـ Upvalue واحد وآثار تعديله
مشاركة Upvalues بين الإغلاقات درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
مشاركة القيمة العلوية نفسها
يمكن لإغلاقين مُعرّفين في النطاق نفسه مشاركة خلية القيمة العلوية نفسها تمامًا. وتظهر التغييرات التي يجريها أحدهما لدى الآخر.
local function makeGetterSetter()
local value = 0
local function get() return value end
local function set(v) value = v end
return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get()) -- 42سبب حدوث المشاركة
لا تنسخ Lua القيم العلوية لكل إغلاق. فجميع الإغلاقات المُنشأة في الكتلة نفسها والتي تشير إلى المتغير المحلي نفسه تشارك خلية علوية واحدة.
نمط المراقب عبر قيمة علوية مشتركة
يمكن للقيمة العلوية المشتركة أن تعمل كناقل رسائل بين عدة إغلاقات.
local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get()) -- 1مشكلة متغير الحلقة
في حلقة numeric for، يُنشئ كل تكرار متغير حلقة محليًا جديدًا، لذلك تلتقط الإغلاقات قيمًا علوية مستقلة.
local fns = {}
for i = 1, 3 do
fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]()) -- 1 2 3 (each closure has its own i)مشكلة متغير حلقة while
في حلقة while، إذا احتفظتم بمتغير واحد يتغير داخل الإغلاقات، فستشارك جميع الإغلاقات القيمة العلوية نفسها، وسترى القيمة النهائية.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
fns[i] = function() return i end -- all share same i!
end
print(fns[1]()) -- 3 (not 1!)التقاط متغير محلي جديد
لالتقاط قيم مستقلة في حلقة while، أدخلوا متغيرًا محليًا جديدًا داخل جسم الحلقة.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
local ci = i -- new local per iteration
fns[i] = function() return ci end
end
print(fns[1]()) -- 1, fns[2]() == 2نمط وحدة الحالة المشتركة
يمكن لوحدة أن تكشف عدة دوال تشارك جدول حالة خاصًا من خلال القيم العلوية.
local function makeStack()
local data = {}
return {
push = function(v) data[#data+1] = v end,
pop = function() local v = data[#data]; data[#data]=nil; return v end,
size = function() return #data end,
}
endالأسماء المستعارة والتغيير
انتبهوا: ترى جميع الإغلاقات التي تشير إلى القيمة العلوية نفسها التغيير نفسه فورًا. وهذا قوي، لكنه قد يسبب اقترانًا غير مقصود.
هوية القيمة العلوية
تُرجع debug.upvalueid(f, n) الهوية الفريدة للقيمة العلوية رقم n في الدالة f. ويشارك الإغلاقان اللذان لهما معرّف القيمة العلوية نفسه الخلية نفسها.
debug.upvaluejoin
تجعل debug.upvaluejoin(f1, n1, f2, n2) القيمة العلوية رقم n1 في f1 تشارك الخلية نفسها مع القيمة العلوية رقم n2 في f2. إنها أداة منخفضة المستوى لتصحيح الأخطاء.
أنماط عملية
- زوجا getter/setter يشتركان في متغير خاص.
- عداد أحداث مع إتاحة إعادة الضبط عبر عدة إغلاقات.
- حالة وحدة مشتركة بين عدة دوال في واجهة API.
سؤال عن القيمة العلوية المشتركة
أُنشئ الإغلاقان get وset في النطاق نفسه، ويلتقط كلاهما value. إذا استُدعيت set(99)، فما الذي تُرجعه get()؟
مراجعة: القيم العلوية المشتركة
تشارك الإغلاقات الموجودة في النطاق نفسه خلايا القيم العلوية. وتظهر التغييرات فورًا لدى جميع الإغلاقات المشاركة. وهذا هو أساس التغليف وحالة الوحدات في Lua.
الأسئلة الشائعة
هل درس «مشاركة Upvalues بين الإغلاقات» مجاني؟
نعم — نص درس «مشاركة Upvalues بين الإغلاقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «مشاركة Upvalues بين الإغلاقات»؟
تعرّف إلى مشاركة عدة إغلاقات لـ Upvalue واحد وآثار تعديله تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «مشاركة Upvalues بين الإغلاقات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما المقصود بـ Upvalues؟
- مشاركة Upvalues بين الإغلاقات
- دوال المصنع والمولّدات
- التخزين المؤقت بالاعتماد على الإغلاقات