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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ when เป็นนิพจน์
- การแปลงชนิดข้อมูลอัจฉริยะ
- ตัวดำเนินการ is และ as
- when แบบครอบคลุมทุกกรณี