الحلقات في Kotlin: for و while و repeat
الحاسوب لا يتعب ولا يملّ: يكرر نفس العمل ملايين المرات بنفس الدقة. الحلقات هي الطريقة التي تستغل بها هذه القدرة: عرض كل الرسائل في تطبيق المحادثة، وحساب مجموع الفاتورة، وتحريك عدّاد تنازلي. وفي Kotlin، الحلقات أقصر وأوضح من كثير من اللغات بفضل المجالات.
حلقة for مع المجال
Section titled “حلقة for مع المجال”for (i in 1..3) { println("الدورة $i")}الدورة 1الدورة 2الدورة 3اقرأها: «لكل i في المجال من 1 إلى 3، نفّذ الكود». لا تحتاج تعريف عدّاد، ولا شرطاً، ولا زيادة يدوية كما في لغات أخرى.
أشكال المجالات
Section titled “أشكال المجالات”for (i in 1 until 4) print("$i ")println()for (i in 10 downTo 0 step 5) print("$i ")println()for (i in 0..10 step 3) print("$i ")1 2 310 5 00 3 6 9| الكتابة | المعنى |
|---|---|
1..5 |
من 1 إلى 5 شاملة الطرفين |
1 until 5 |
من 1 إلى 4 (بدون 5) |
10 downTo 1 |
عدّ تنازلي من 10 إلى 1 |
step 2 |
القفز بمقدار 2 بدلاً من 1 |
لاحظ أن print تطبع دون النزول لسطر جديد، و println() الفارغة تنزل سطراً فقط.
تخيّل المجال مثل درجات السلم: 1..5 تصعد كل الدرجات، و step 2 تقفز درجتين كل مرة، و downTo تنزل.
المرور على القوائم
Section titled “المرور على القوائم”val fruits = listOf("تفاح", "موز", "برتقال")for (fruit in fruits) { println("- $fruit")}- تفاح- موز- برتقالوإذا احتجت رقم كل عنصر مع قيمته، استخدم withIndex():
for ((index, fruit) in fruits.withIndex()) { println("$index: $fruit")}0: تفاح1: موز2: برتقالالصيغة (index, fruit) تفكّ كل عنصر إلى جزأين، وتسمى التفكيك (Destructuring). ولاحظ أن الترقيم يبدأ من صفر.
حلقة while
Section titled “حلقة while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
var balance = 100var days = 0while (balance > 0) { balance -= 30 days++}println("انتهى الرصيد بعد $days أيام")انتهى الرصيد بعد 4 أياموهناك أيضاً do { ... } while (...) التي تنفّذ الكود مرة واحدة على الأقل قبل فحص الشرط.
الدالة repeat
Section titled “الدالة repeat”إذا أردت تكرار شيء عدداً محدداً من المرات ولا تحتاج العدّاد:
repeat(3) { println("مرحباً")}مرحباًمرحباًمرحباًبسيطة وواضحة: «كرر 3 مرات».
break و continue
Section titled “break و continue”break: اخرج من الحلقة فوراً.continue: تخطَّ باقي هذه الدورة وانتقل للتالية.
for (i in 1..10) { if (i % 2 == 0) continue // تخطَّ الزوجي if (i > 7) break // توقف بعد 7 print("$i ")}1 3 5 7أمثلة عملية
Section titled “أمثلة عملية”جدول الضرب:
val num = 7for (i in 1..5) { println("$num × $i = ${num * i}")}7 × 1 = 77 × 2 = 147 × 3 = 217 × 4 = 287 × 5 = 35مجموع الأعداد من 1 إلى 100:
var sum = 0for (i in 1..100) sum += iprintln(sum)5050جرّب بنفسك
Section titled “جرّب بنفسك”- اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!» باستخدام
downTo. - اطبع كل الأعداد الزوجية من 2 إلى 20 باستخدام
step. - اكتب قائمة بأسماء 4 أصدقاء، واطبع كل اسم مع رقمه بدءاً من 1 (تلميح:
index + 1). - تحدٍّ (FizzBuzz): اطبع الأعداد من 1 إلى 15، لكن «Fizz» بدل مضاعفات 3، و«Buzz» بدل مضاعفات 5، و«FizzBuzz» بدل مضاعفات الاثنين معاً. جرّب حلها بـ
when.
أخطاء شائعة
Section titled “أخطاء شائعة”- الخلط بين .. و until:
1..5تشمل 5، و1 until 5لا تشملها. فكّر في آخر قيمة تريدها. - العد التنازلي بـ ..:
10..1مجال فارغ لا يدخل الحلقة أبداً. استخدم10 downTo 1. - نسيان أن الفهرس يبدأ من صفر: أول عنصر في
withIndexرقمه 0.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا تطبع for (i in 1 until 4) print(i)؟
until لا تشمل الطرف الأخير، فالقيم 1 و 2 و 3 فقط.
سؤال
أي كتابة صحيحة للعد التنازلي من 5 إلى 1؟
downTo للعد التنازلي، أما 5..1 فمجال فارغ لأن البداية أكبر من النهاية.
الخلاصة
Section titled “الخلاصة”for (i in 1..5)حلقة بمجال شامل، وuntilيستثني الطرف الأخير.downToللعد التنازلي، وstepلتغيير مقدار القفز.for (item in list)للمرور على القوائم، وwithIndex()للرقم والقيمة معاً.whileحسب شرط، وrepeat(n)لتكرار عدد محدد من المرات.breakللخروج من الحلقة، وcontinueلتخطي الدورة الحالية.