when الشاملة
غطّوا جميع الحالات
when الشاملة درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
تغطية جميع الحالات
يتعامل when الشامل لجميع الحالات مع كل قيمة ممكنة. وعند استخدامه كتعبير، يتطلب Kotlin ذلك لضمان إنتاج نتيجة دائمًا.
يوضح هذا الدرس كيفية جعل when شاملًا لجميع الحالات، وسبب فائدته.
يجعل else التعبير شاملًا لجميع الحالات
بالنسبة إلى القيم ذات النطاق المفتوح مثل Int، يغطي فرع else كل ما لم يُذكر.
وهذا يضمن أن يطابق when حالةً دائمًا.
fun label(n: Int): String = when (n) {
0 -> "zero"
1 -> "one"
else -> "many"
}
fun main() {
println(label(0))
println(label(5))
}تتيح التعدادات شمول جميع الحالات
يعرف المترجم جميع القيم الممكنة عند استخدام التعداد. اذكرها كلها، ويمكنك حذف else.
enum class Direction { NORTH, SOUTH, EAST, WEST }
fun turn(d: Direction): String = when (d) {
Direction.NORTH -> "up"
Direction.SOUTH -> "down"
Direction.EAST -> "right"
Direction.WEST -> "left"
}
fun main() {
println(turn(Direction.EAST))
}حالة مفقودة في تعداد
إذا نسيت إحدى قيم التعداد في تعبير when، فسيُبلغ المترجم عن خطأ.
وهذا يكتشف الأخطاء فور إضافة ثابت جديد إلى التعداد.
enum class Status { ACTIVE, PAUSED, STOPPED }
fun describe(s: Status): String = when (s) {
Status.ACTIVE -> "running"
Status.PAUSED -> "paused"
Status.STOPPED -> "stopped"
}
fun main() {
println(describe(Status.PAUSED))
}الفئات المختومة
تحتوي الفئة المختومة على مجموعة ثابتة من الفئات الفرعية المعروفة وقت الترجمة.
وهذا يتيح لـ when أن يكون شاملًا لجميع الأنواع الفرعية من دون else.
sealed class Shape
class Circle(val r: Double) : Shape()
class Square(val s: Double) : Shape()
fun area(shape: Shape): Double = when (shape) {
is Circle -> 3.14159 * shape.r * shape.r
is Square -> shape.s * shape.s
}
fun main() {
println(area(Square(4.0)))
}أهمية شمول جميع الحالات
يحوّل when الشامل الحالات المفقودة إلى أخطاء ترجمة بدلًا من أخطاء صامتة.
عند إضافة فئة فرعية أو قيمة تعداد جديدة، يشير المترجم إلى كل تعبير when يجب تحديثه.
لا تُفرض شمولية العبارات
عند استخدام when بوصفه عبارة (من دون إسناد نتيجته)، لا تكون الشمولية مطلوبة.
لكن من الممارسات الجيدة أن يكون شاملًا على أي حال عند التعامل مع التعدادات والأنواع المختومة.
enum class Light { RED, GREEN }
fun main() {
val light = Light.RED
when (light) {
Light.RED -> println("stop")
Light.GREEN -> println("go")
}
}الجمع بين الفئات المختومة والبيانات
غالبًا ما تستخدم التسلسلات الهرمية المختومة فئات فرعية من نوع data class، ما يمنحك مطابقة شاملة وتحويلات ذكية للوصول إلى الخصائص.
sealed class Result
data class Ok(val value: Int) : Result()
data class Err(val message: String) : Result()
fun show(r: Result): String = when (r) {
is Ok -> "ok: " + r.value
is Err -> "error: " + r.message
}
fun main() {
println(show(Ok(42)))
println(show(Err("boom")))
}else كشبكة أمان
لا يزال بإمكانك إضافة else إلى when مختوم أو خاص بتعداد، لكن المترجم سيتوقف عندها عن التحذير من الحالات الجديدة.
يؤدي حذف else إلى الحفاظ على أمان وقت الترجمة، لذا يُفضَّل ذلك مع الأنواع المغلقة.
enum class Coin { HEADS, TAILS }
fun flip(c: Coin): Int = when (c) {
Coin.HEADS -> 1
Coin.TAILS -> 0
}
fun main() {
println(flip(Coin.HEADS))
}Boolean والقيم المغلقة
لا يحتوي Boolean إلا على قيمتين، لذا فإن ذكر كلتيهما يجعل when شاملًا من دون else.
fun yesNo(flag: Boolean): String = when (flag) {
true -> "yes"
false -> "no"
}
fun main() {
println(yesNo(true))
println(yesNo(false))
}جمع المفاهيم
يعني when الشامل تغطية جميع الحالات:
- يغطي
elseالقيم ذات النطاق المفتوح مثلInt - يمكن أن تكون التعدادات والفئات المختومة و
Booleanشاملة من دونelse - يُبلغ المترجم عن الحالات المفقودة عند إضافة حالات جديدة
sealed class Event
object Start : Event()
object Stop : Event()
fun handle(e: Event): String = when (e) {
is Start -> "starting"
is Stop -> "stopping"
}
fun main() {
println(handle(Start))
println(handle(Stop))
}اختبار سريع
اختبر مدى فهمك لـ when الشامل.
مراجعة
لقد تعلمت كيفية جعل when شاملًا:
- يتعامل
elseمع القيم ذات النطاق المفتوح - يمكن تغطية التعدادات والفئات المختومة و
Booleanبالكامل - تكتشف فحوصات وقت الترجمة الحالات المفقودة
وبذلك يكتمل مساق تعبيرات When والتحويلات الذكية.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «when الشاملة» مجاني؟
نعم — نص درس «when الشاملة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «when الشاملة»؟
غطّوا جميع الحالات تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «when الشاملة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.