0Pricing
Kotlin Academy · บทเรียน

when แบบครอบคลุมทุกกรณี

ครอบคลุมทุกกรณี

when แบบครอบคลุมทุกกรณี เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ครอบคลุมทุกกรณี

when ที่ครอบคลุมทุกกรณีจะจัดการกับค่าที่เป็นไปได้ทั้งหมด เมื่อใช้เป็นนิพจน์ Kotlin กำหนดให้ต้องทำเช่นนี้เพื่อให้มีการสร้างผลลัพธ์เสมอ

บทเรียนนี้จะแสดงวิธีทำให้ when ครอบคลุมทุกกรณีและอธิบายเหตุผลที่วิธีนี้มีประโยชน์

แขนงอื่นทำให้ครอบคลุมทุกกรณี

สำหรับหัวข้อแบบเปิด เช่น 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")
    }
}

การรวมชนิดแบบปิดผนึกกับข้อมูล

ลำดับชั้นแบบปิดผนึกมักใช้คลาสข้อมูลเป็นคลาสย่อย ทำให้จับคู่ได้ครอบคลุมทุกกรณี พร้อมทั้งใช้การแปลงชนิดอัตโนมัติแบบอัจฉริยะเพื่อเข้าถึงคุณสมบัติได้

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 ให้กับนิพจน์ 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 มีเพียงสองค่า ดังนั้นการระบุทั้งสองค่าจะทำให้นิพจน์ 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 และการแปลงชนิดอัจฉริยะ

คำถามที่พบบ่อย

บทเรียน “when แบบครอบคลุมทุกกรณี” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “when แบบครอบคลุมทุกกรณี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “when แบบครอบคลุมทุกกรณี”

ครอบคลุมทุกกรณี คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “when แบบครอบคลุมทุกกรณี” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การใช้ when เป็นนิพจน์
  2. การแปลงชนิดข้อมูลอัจฉริยะ
  3. ตัวดำเนินการ is และ as
  4. when แบบครอบคลุมทุกกรณี
← กลับไปที่ Kotlin Academy