0Pricing
Lua Academy · درس

المكرّرات ذات الحالة باستخدام الإغلاقات

أنشئ مكرّرات تحتفظ بالحالة بين الاستدعاءات باستخدام الإغلاقات

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

متى تكون الإغلاقات مفيدة

عندما يحتاج المكرّر إلى الحفاظ على حالة معقدة ومتطورة (مثل الموضع أو المكدس أو السجل)، تكون الإغلاقات الأداة الطبيعية. وتعيش الحالة في القيم العلوية.

نمط مكرّر الإغلاق

أرجعوا دالة واحدة؛ إذ تُحفظ الحالة في القيم العلوية. ولا توفر for العامة حالة خارجية، بل تستدعي الدالة في كل مرة.

local function chars(s)
  local i = 0
  return function()
    i = i + 1
    local c = s:sub(i, i)
    return c ~= "" and c or nil
  end
end
for c in chars("lua") do print(c) end

مكرّر أسطر الملف

يُرجع مكرّر إغلاق كلاسيكي يحتفظ بالحالة أسطرًا من مؤشر ملف حتى الوصول إلى نهاية الملف.

local function lines(filename)
  local f = io.open(filename, "r")
  return function()
    local line = f:read("*l")
    if not line then f:close() end
    return line
  end
end

مكرّر التصفية

غلّف مكرّرًا موجودًا بإغلاق يتخطّى العناصر التي لا تطابق دالة الاختبار.

local function filtered(iter, pred)
  return function()
    local v = iter()
    while v ~= nil and not pred(v) do
      v = iter()
    end
    return v
  end
end

مكرّر التحويل

يحوّل مكرّر التحويل كل عنصر أثناء المرور عليه دون إنشاء جدول وسيط.

local function mapped(iter, fn)
  return function()
    local v = iter()
    if v ~= nil then return fn(v) end
  end
end

المكرّر المضموم

يجلب مكرّر الدمج القيم من مكرّرين في الوقت نفسه، ويتوقف عند استنفاد أيٍّ منهما.

local function zipped(iter1, iter2)
  return function()
    local a, b = iter1(), iter2()
    if a ~= nil and b ~= nil then return a, b end
  end
end

المكرّر المتسلسل

يستنفد مكرّر السلسلة أحد المكرّرين قبل الانتقال إلى التالي.

local function chained(...)
  local iters = {...}
  local idx = 1
  return function()
    while idx <= #iters do
      local v = iters[idx]()
      if v ~= nil then return v end
      idx = idx + 1
    end
  end
end

المكرّر المحدود العدد

قيّد المكرّر بحد أقصى قدره N من القيم باستخدام عدّاد إغلاق.

local function take(n, iter)
  local count = 0
  return function()
    count = count + 1
    if count <= n then return iter() end
  end
end

مكرّر اجتياز الشجرة

يستخدم اجتياز الشجرة بعمق أول مكدسًا (جدولًا كقيمة علوية) للحفاظ على حالة الاجتياز.

local function dfs(root)
  local stack = {root}
  return function()
    if #stack == 0 then return nil end
    local node = table.remove(stack)
    for _, child in ipairs(node.children or {}) do
      stack[#stack+1] = child
    end
    return node
  end
end

اعتبارات الذاكرة

تخصّص المكرّرات التي تحتفظ بالحالة كائن إغلاق. في الحلقات الداخلية الضيقة جدًا، قد يكون المكرّر عديم الحالة أفضل. أما في عمليات الاجتياز المعقدة، فالإغلاق يستحق التكلفة.

مقارنة: المكرّر المحتفظ بالحالة مقابل عديم الحالة

  • المحتفظ بالحالة: حالة معقدة، وترتيب اجتياز任ي، وسهل الكتابة.
  • عديم الحالة: وصول تسلسلي بسيط، وتخصيص معدوم، وسرعة عالية.

سؤال حول المكرّر المحتفظ بالحالة

أين يخزّن مكرّر الإغلاق المحتفظ بالحالة حالته؟

مراجعة: المكرّرات المحتفظة بالحالة

تخزّن المكرّرات المحتفظة بالحالة المعتمدة على الإغلاق حالة الاجتياز المعقدة في القيم العلوية، ما يتيح عوامل التصفية والتحويل والأشجار وخطوط المعالجة الكسولة، وكلها قابلة للتركيب وفعّالة من حيث الذاكرة.

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

هل درس «المكرّرات ذات الحالة باستخدام الإغلاقات» مجاني؟

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

ماذا ستتعلم في «المكرّرات ذات الحالة باستخدام الإغلاقات»؟

أنشئ مكرّرات تحتفظ بالحالة بين الاستدعاءات باستخدام الإغلاقات تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «المكرّرات ذات الحالة باستخدام الإغلاقات»؟

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

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

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

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

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