0Pricing
Lua Academy · درس

حلقات while وrepeat-until

استخدم while وrepeat-until للتكرار المعتمد على الشروط

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

حلقة while

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

local count = 1

while count <= 5 do
  print(count)
  count = count + 1
end
-- prints 1 through 5

حلقة repeat-until

حلقة repeat...until هي النظير في Lua لحلقة do-while. يُنفَّذ جسم الحلقة مرة واحدة على الأقل، ويُتحقَّق من الشرط بعد كل تكرار. تتوقف الحلقة عندما يصبح الشرط صحيحًا، وهو عكس حلقة while. تكون المتغيرات المعلنة داخل الجسم مرئية في الشرط.

local n = 1

repeat
  print(n)
  n = n * 2
until n > 100
-- prints: 1, 2, 4, 8, 16, 32, 64

الحلقات اللانهائية مع break

استخدم while true do لحلقات الأحداث أو أنماط إعادة المحاولة، مع استخدام break للخروج عند تحقق شرط معيّن. هذا النمط شائع في الحلقات الرئيسية للألعاب وخوادم الشبكة التي تعمل باستمرار.

local attempts = 0
local MAX = 3

while true do
  attempts = attempts + 1
  print("Attempt " .. attempts)
  if attempts >= MAX then
    print("Max attempts reached")
    break
  end
end

العد التنازلي باستخدام while

تعمل حلقات while جيدًا أيضًا عند العد التنازلي. المهم هو تحديث المتغير بطريقة تؤدي في النهاية إلى تحقق شرط الخروج. يُعد نسيان تحديث العداد سببًا شائعًا للحلقات اللانهائية.

local i = 10

while i > 0 do
  io.write(i .. " ")
  i = i - 1
end
print()   -- newline
-- output: 10 9 8 7 6 5 4 3 2 1

استخدام repeat-until للتحقق من صحة الإدخال

يُعد نمط repeat-until مثاليًا للتحقق من صحة الإدخال: اطلب الإدخال مرة، ثم تحقّق منه. في هذا النمط، يُنفَّذ الجسم دائمًا مرة واحدة على الأقل، وهو ما يطابق التسلسل الطبيعي «اسأل، ثم تحقّق».

-- Simulated input validation
local inputs = {-1, 0, 5}  -- pretend user input
local idx = 0
local value

repeat
  idx = idx + 1
  value = inputs[idx]
  print("Got: " .. value)
until value > 0

print("Valid value: " .. value)  -- 5

متغيرات الحلقة محلية

تُعاد تهيئة المتغيرات المعلنة باستخدام local داخل جسم الحلقة في كل تكرار. وهذا مهم عند التقاط متغيرات الحلقة داخل الإغلاقات، إذ يلتقط كل إغلاق نسخته الخاصة. أما المتغيرات المعلنة خارج الحلقة فتستمر بين التكرارات.

local callbacks = {}

for i = 1, 3 do
  local captured = i        -- local per iteration
  callbacks[i] = function() return captured end
end

print(callbacks[1]())  -- 1
print(callbacks[2]())  -- 2
print(callbacks[3]())  -- 3

نمط المُجمِّع

من الاستخدامات الشائعة لحلقة while تجميع نتيجة. فالجمع والضرب وضم السلاسل النصية وبناء الجداول كلها تتبع نمط المُجمِّع: تهيئة المتغير قبل الحلقة، وتحديثه داخلها، ثم استخدام النتيجة بعدها.

local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
local sum = 0
local i = 1

while i <= #numbers do
  sum = sum + numbers[i]
  i = i + 1
end

print("Sum:", sum)     -- 31
print("Avg:", sum / #numbers)  -- 3.875

الحلقات المتداخلة

يمكن تداخل الحلقات. تحتفظ كل حلقة بعدادها الخاص. استخدم أسماء متغيرات وصفية لتحسين الوضوح. تُخرج العبارة break من الحلقة المحيطة الأكثر تداخلًا فقط؛ وللخروج من عدة مستويات، قد تحتاج إلى متغير راية أو إلى goto (في Lua 5.2 وما بعدها).

local found = false
local target = 6

local i = 1
while i <= 3 and not found do
  local j = 1
  while j <= 3 do
    if i * j == target then
      print(i .. " * " .. j .. " = " .. target)
      found = true
      break
    end
    j = j + 1
  end
  i = i + 1
end

استخدام goto للخروج من عدة مستويات

قدّمت Lua 5.2 وما بعدها goto للانتقال إلى موضع ذي تسمية. ورغم أنه غير محبّذ عمومًا، فإنه مناسب للخروج من الحلقات المتداخلة بطريقة واضحة دون استخدام متغير راية. تُعرَّف التسميات باستخدام ::name::.

for i = 1, 5 do
  for j = 1, 5 do
  -- goto only valid approach for nested break in Lua
    if i * j > 10 then
      goto done
    end
    io.write(i*j .. " ")
  end
end
::done::
print()
print("Stopped early")

المفاضلة بين while و repeat

while: استخدمها عندما يكون من الممكن ألا تُنفَّذ الحلقة مطلقًا؛ إذ يُتحقَّق من الشرط أولًا. repeat-until: استخدمها عندما تحتاج إلى تنفيذ الحلقة مرة واحدة على الأقل؛ إذ يُتحقَّق من الشرط بعدها. فضّل while لمعظم الحلقات. واستخدم repeat-until للقوائم والمطالبات وحلقات إعادة المحاولة عندما يجب تنفيذ الإجراء قبل التحقق.

-- while: may execute zero times
local ready = false
while ready do
  print("never prints")
end

-- repeat-until: always executes at least once
local done = false
repeat
  print("runs once even though done=false")
  done = true
until done

تحقق سريع

متى يُتحقَّق من الشرط في حلقة repeat...until؟

مراجعة: while و repeat-until

النقاط الأساسية:

  • while cond do ... end — يتحقَّق من الشرط قبل التنفيذ؛ وقد لا تُنفَّذ الحلقة إطلاقًا
  • repeat ... until cond — يتحقَّق من الشرط بعد التنفيذ؛ وتُنفَّذ الحلقة مرة واحدة على الأقل
  • break تخرج من الحلقة الأكثر تداخلًا
  • goto ::label:: يمكنها إخراج التنفيذ من الحلقات المتداخلة (في Lua 5.2 وما بعدها)
  • تُعاد تهيئة المتغيرات المحلية للحلقة في كل تكرار
  • استخدم نمط المُجمِّع لبناء النتائج

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

هل درس «حلقات while وrepeat-until» مجاني؟

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

ماذا ستتعلم في «حلقات while وrepeat-until»؟

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

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

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

كم من الوقت يستغرق درس «حلقات while وrepeat-until»؟

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

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

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

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

  1. عبارات if وelseif وelse
  2. حلقات while وrepeat-until
  3. حلقة for الرقمية
  4. for العامة وbreak
← العودة إلى Lua Academy