الحلقة بنية تحكم تسمح بتنفيذ الكود بشكل متكرر بناءً على شرط محدد.
while
حلقة while بنية تحكم تسمح بتنفيذ الكود بشكل متكرر بناءً على شرط محدد.
يستمر الكود داخل حلقة while في التنفيذ ما دام الشرط يُقيَّم إلى قيمة صحيحة.
غالبًا ما تُستخدم حلقات while عندما يكون عدد التكرارات غير معروف مسبقًا، ويمكن استخدامها في أي موقف تحتاج فيه إلى حلقة.
يُقيَّم الشرط قبل تنفيذ الكود داخل الحلقة، وهذا يعني أنه إذا كان الشرط خطأ، فلن يُنفَّذ الكود داخل الحلقة أبدًا.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
عندما تريد المرور على سلسلة نصية، يمكنك التكرار على طول السلسلة النصية.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
تعمل حلقات until مثل حلقات while تمامًا، إلا أن الكود داخل الحلقة يستمر في التنفيذ حتى يُقيَّم الشرط إلى قيمة صحيحة.
وهو الفرق نفسه بين if و unless.
i = 0
until i == 3
puts i
i += 1
end
من الأخطاء الشائعة في حلقات while الدخول في «حلقة لا نهائية» لا تنتهي أبدًا.
قد تنشأ الحلقة اللانهائية عندما لا يُقيَّم الشرط أبدًا إلى قيمة صحيحة أو خاطئة.
وهذا غالبًا بسبب خطأ من المبرمج، مثل نسيان زيادة متغير الحلقة.
لكن في بعض الأحيان تكون الحلقة اللانهائية أوضح أسلوب لتنفيذ منطق البرنامج.
أو يكون التكرار إلى ما لا نهاية أمرًا ضروريًا؛ فمثلًا، ينتظر خادم HTTP اتصالًا واردًا، ويتعامل معه، ثم ينتظر الاتصال التالي.
breakيمكن استخدام الكلمة المفتاحية break للخروج من الحلقة مبكرًا.
وقد يكون هذا ملائمًا عندما تريد الخروج من الحلقة مبكرًا في ظروف معينة.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
nextيمكن استخدام الكلمة المفتاحية next للانتقال إلى التكرار التالي في الحلقة.
وقد يكون هذا ملائمًا عندما تريد تخطي تكرارات معينة في الحلقة.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
قد يختلف نوع المتغير أثناء التكرار.
في المثال التالي، نوع a هو Int32 | String لأنه قد يكون Int32 أو String في الجزء الأول من الحلقة.
لن يحمل المتغير a النوع Int32 | String إلا في الجزء الأول من الحلقة، لأنه عند بدء الحلقة يحمل Int32، وفي التكرار الثاني يحمل String.
سيُشرح نظام الأنواع المتعددة هذا بالتفصيل لاحقًا.
ولكن بما أننا متأكدون أن الجزء الثاني من الحلقة لن يحمل إلا String، فإن نوع a هو String في الجزء الثاني من الحلقة.
وعند التشغيل، لن يحمل Int32 و String في الوقت نفسه أبدًا.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
while كتعبيريمكن استخدام while كتعبير، ما يعني أنه يمكن استخدامه كقيمة لمتغير.
القيمة التي تُرجَع هي القيمة المعطاة مع الكلمة المفتاحية break.
ولن تُرجع قيمة التعبير الأخير في الحلقة.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil