حلقات 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عبارات if وelseif وelse
- حلقات while وrepeat-until
- حلقة for الرقمية
- for العامة وbreak