المولّدات المعتمدة على البرامج التعاونية
استخدم coroutine.wrap لإنشاء تسلسلات مولّدات كسولة
المولّدات المعتمدة على البرامج التعاونية درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
الدافع إلى مولّدات coroutine
تعمل الإغلاقات جيدًا مع المولّدات البسيطة. لكن إذا تطلب منطق التوليد حلقات متداخلة أو تدفق تحكم معقدًا، فسيكون مولّد coroutine أوضح بكثير.
أساسيات coroutine.wrap
يعيد coroutine.wrap(fn) دالة. تستأنف كل مكالمة coroutine؛ وتصبح القيم التي تُرجعها coroutine.yield قيمة الإرجاع.
local gen = coroutine.wrap(function()
coroutine.yield(1)
coroutine.yield(2)
coroutine.yield(3)
end)
for v in gen do print(v) endمولّد التسلسل اللانهائي
يمكن لـ coroutine أن يُرجع قيمًا إلى ما لا نهاية، ما يجعله مناسبًا تمامًا للتسلسلات اللانهائية التي ينهيها المستدعي باستخدام break.
local function naturals()
return coroutine.wrap(function()
local n = 0
while true do
n = n + 1
coroutine.yield(n)
end
end)
end
for v in naturals() do
if v > 5 then break end
print(v)
endمولّد اجتياز الشجرة
يصبح الاجتياز العميق التكراري سهلًا مع coroutines؛ فما عليك إلا الإرجاع من الاستدعاءات التكرارية دون إدارة مكدس صريح.
local function walkTree(node)
return coroutine.wrap(function()
local function recurse(n)
coroutine.yield(n.value)
for _, child in ipairs(n.children or {}) do
recurse(child)
end
end
recurse(node)
end)
endمولّد فيبوناتشي
يأتي تسلسل فيبوناتشي بصورة طبيعية على هيئة coroutine: احتفظ بمتغيري حالة وأرجع كل حد.
local function fibs()
return coroutine.wrap(function()
local a, b = 0, 1
while true do
coroutine.yield(a)
a, b = b, a + b
end
end)
end
local fib = fibs()
for i = 1, 8 do print(fib()) endتمرير القيم إلى المولّد
تكون وسيطة الدالة المستأنفة هي قيمة الإرجاع الخاصة بـ yield، ما يتيح اتصالًا ثنائي الاتجاه.
local acc = coroutine.wrap(function()
local total = 0
while true do
local n = coroutine.yield(total)
total = total + (n or 0)
end
end)
acc() -- start
print(acc(10)) -- 10
print(acc(5)) -- 15coroutine.wrap مقابل coroutine.create
يُعد wrap أبسط ويطرح الأخطاء. أما create فيُرجع كائن thread ويتيح لك معالجة الأخطاء من قيم الإرجاع الخاصة بـ resume.
خط أنابيب المولّد
صِل المولّدات المعتمدة على coroutines لإنشاء خطوط معالجة كسولة: يُرجع المنتج البيانات الخام، ويُرجع عامل التصفية العناصر المطابقة، ويُرجع عامل التحويل العناصر المحوّلة.
انتشار الأخطاء
إذا طرح coroutine مغلّف خطأً، فإن دالة التغليف تطرح الخطأ أيضًا. غلّف استدعاء المولّد في pcall لاستهلاكه بأمان.
كفاءة الذاكرة
مولّدات coroutine كسولة؛ فهي تحسب القيم عند الطلب. ويجنّب ذلك إنشاء جداول وسيطة كبيرة، وهي ميزة مهمة مع مجموعات البيانات الكبيرة.
معالجة الاستنفاد
عندما تُرجع دالة coroutine قيمة (ولا تستخدم yield)، يعيد الاستدعاء التالي للدالة المغلّفة القيمة nil، ما ينهي حلقة for العامة تلقائيًا.
سؤال حول مولّد coroutine
ماذا يحدث عندما تُرجع دالة coroutine في مولّد يعتمد على coroutine.wrap قيمة (ولا تستخدم yield)؟
مراجعة: مولّدات coroutine
تحوّل coroutine.wrap أي coroutine إلى دالة مولّد قابلة لإعادة الاستخدام. وتتيح تسلسلات لانهائية كسولة، واجتيازات تكرارية، ومراحل خطوط المعالجة مع تدفق تحكم واضح.
الأسئلة الشائعة
هل درس «المولّدات المعتمدة على البرامج التعاونية» مجاني؟
نعم — نص درس «المولّدات المعتمدة على البرامج التعاونية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «المولّدات المعتمدة على البرامج التعاونية»؟
استخدم coroutine.wrap لإنشاء تسلسلات مولّدات كسولة تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «المولّدات المعتمدة على البرامج التعاونية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بروتوكول for العامة
- المكرّرات عديمة الحالة
- المكرّرات ذات الحالة باستخدام الإغلاقات
- المولّدات المعتمدة على البرامج التعاونية