การจับคู่ที่ครบถ้วน
คอมไพเลอร์ตรวจสอบความครบถ้วน
การจับคู่ที่ครบถ้วน เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
การจับคู่รูปแบบให้ครบทุกกรณีคืออะไร
การจับคู่รูปแบบจะ ครบทุกกรณี เมื่อจัดการกับค่าที่เป็นไปได้ทุกค่าของชนิดที่กำลังจับคู่
สำหรับ trait แบบ sealed คอมไพเลอร์ทราบรูปแบบย่อยทั้งหมดและตรวจสอบได้ว่าการจับคู่ของคุณครอบคลุมครบหรือไม่
การจับคู่รูปแบบที่ครบถ้วน
เมื่อคุณจัดการกับรูปแบบย่อยทุกแบบของ trait แบบ sealed คอมไพเลอร์ก็จะยอมรับและไม่แสดงคำเตือน
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def name(c: Color): String = c match {
case Red => "red"
case Green => "green"
case Blue => "blue"
}
def main(args: Array[String]): Unit = {
println(name(Blue))
}
}คอมไพเลอร์คอยช่วยคุณ
หากคุณละรูปแบบย่อยใดไว้ คอมไพเลอร์จะแสดงคำเตือน การจับคู่รูปแบบไม่ครบทุกกรณี ขณะคอมไพล์
นี่คือกลไกป้องกันความปลอดภัย เพราะคุณจะพบช่องว่างก่อนเรียกใช้โปรแกรม
เพิ่มรูปแบบย่อยภายหลัง
ประโยชน์ที่แท้จริงจะเห็นได้เมื่อคุณเพิ่มรูปแบบย่อยใหม่ การจับคู่รูปแบบที่ไม่ครบทุกกรณีทั่วทั้งฐานโค้ดจะแสดงคำเตือนขึ้นมา เพื่อเตือนให้คุณจัดการกับกรณีใหม่
วิธีนี้ทำให้การปรับโครงสร้างโค้ดปลอดภัยและคาดเดาได้
เหตุผลที่ควรหลีกเลี่ยงไวลด์การ์ด
การเพิ่ม case _ => จะปิดคำเตือนเรื่องการจับคู่ไม่ครบทุกกรณี ซึ่งอาจซ่อนข้อผิดพลาดเมื่อคุณเพิ่มรูปแบบย่อยในภายหลัง
สำหรับ ADT แบบ sealed ควรระบุรูปแบบย่อยแต่ละแบบอย่างชัดเจน เพื่อให้คอมไพเลอร์ยังคงช่วยป้องกันคุณ
sealed trait Status
case object Active extends Status
case object Inactive extends Status
object Main {
def label(s: Status): String = s match {
case Active => "on"
case Inactive => "off"
}
def main(args: Array[String]): Unit = {
println(label(Active))
}
}ความครบถ้วนเมื่อมีข้อมูล
ความครบถ้วนใช้ได้กับรูปแบบย่อยที่มีข้อมูลด้วย คุณผูกค่าฟิลด์ไว้และยังต้องครอบคลุมรูปแบบย่อยทุกแบบ
sealed trait Shape
case class Circle(r: Double) extends Shape
case class Square(s: Double) extends Shape
object Main {
def area(sh: Shape): Double = sh match {
case Circle(r) => 3.14159 * r * r
case Square(s) => s * s
}
def main(args: Array[String]): Unit = {
println(area(Circle(2)))
println(area(Square(3)))
}
}ใช้ร่วมกับเงื่อนไขกำกับ
โปรดระวัง เงื่อนไขกำกับอาจทำให้การจับคู่รูปแบบไม่ครบทุกกรณี เพราะคอมไพเลอร์พิสูจน์ไม่ได้ว่าเงื่อนไขเหล่านั้นครอบคลุมค่าทั้งหมด
ให้เพิ่มกรณีสุดท้ายของรูปแบบย่อยเดียวกันโดยไม่มีเงื่อนไขกำกับ เพื่อให้ยังครบทุกกรณี
sealed trait Temp
case class Celsius(v: Int) extends Temp
object Main {
def feel(t: Temp): String = t match {
case Celsius(v) if v >= 30 => "hot"
case Celsius(v) => "not hot"
}
def main(args: Array[String]): Unit = {
println(feel(Celsius(35)))
println(feel(Celsius(10)))
}
}ความครบถ้วนกับ Option
Option ในไลบรารีมาตรฐานเป็น ADT แบบ sealed ที่มี Some และ None การจับคู่ทั้งสองแบบทำให้ครบทุกกรณี
object Main {
def show(o: Option[Int]): String = o match {
case Some(v) => s"value $v"
case None => "nothing"
}
def main(args: Array[String]): Unit = {
println(show(Some(7)))
println(show(None))
}
}ความครบถ้วนแบบซ้อน
ความครบถ้วนยังช่วยกับ ADT ที่ซ้อนกันด้วย คอมไพเลอร์จะวิเคราะห์แต่ละระดับที่คุณแยกโครงสร้างออกมา
sealed trait Tree
case object Leaf extends Tree
case class Node(v: Int, l: Tree, r: Tree) extends Tree
object Main {
def depth(t: Tree): Int = t match {
case Leaf => 0
case Node(_, l, r) => 1 + math.max(depth(l), depth(r))
}
def main(args: Array[String]): Unit = {
println(depth(Node(1, Leaf, Node(2, Leaf, Leaf))))
}
}เหตุใดเรื่องนี้จึงสำคัญ
การตรวจสอบความครบถ้วนโดยคอมไพเลอร์ช่วยให้คุณมี:
- ความมั่นใจว่าจัดการทุกกรณีแล้ว
- การแจ้งเตือนอัตโนมัติเมื่อ ADT เติบโตขึ้น
- MatchErrors ขณะเรียกใช้งานน้อยลง
- การปรับโครงสร้างโค้ดขนาดใหญ่ที่ปลอดภัยยิ่งขึ้น
นำทุกอย่างมารวมกัน
ADT แบบ sealed ที่ครอบคลุมครบทุกกรณี หากเพิ่มรูปแบบย่อยใหม่ที่นี่ คอมไพเลอร์จะแสดงคำเตือน
sealed trait Command
case object Start extends Command
case object Stop extends Command
case class SetSpeed(v: Int) extends Command
object Main {
def run(c: Command): String = c match {
case Start => "starting"
case Stop => "stopping"
case SetSpeed(v) => s"speed $v"
}
def main(args: Array[String]): Unit = {
List(Start, SetSpeed(5), Stop).foreach(c => println(run(c)))
}
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการจับคู่รูปแบบให้ครบทุกกรณี
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับการจับคู่รูปแบบให้ครบทุกกรณี:
- การจับคู่รูปแบบครบทุกกรณีเมื่อครอบคลุมรูปแบบย่อยทุกแบบ
- สำหรับ trait แบบ sealed คอมไพเลอร์จะตรวจสอบและแจ้งเตือนเมื่อมีช่องว่าง
- การเพิ่มรูปแบบย่อยจะแสดงการจับคู่รูปแบบที่ยังไม่สมบูรณ์ทั้งหมด
- หลีกเลี่ยง
case _กับ ADT แบบ sealed เพื่อคงการป้องกันนี้ไว้ - เงื่อนไขกำกับอาจทำให้ความครบถ้วนเสียไป ให้เพิ่มกรณีสำรองที่ไม่มีเงื่อนไขกำกับ
คำถามที่พบบ่อย
บทเรียน “การจับคู่ที่ครบถ้วน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจับคู่ที่ครบถ้วน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจับคู่ที่ครบถ้วน”
คอมไพเลอร์ตรวจสอบความครบถ้วน คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจับคู่ที่ครบถ้วน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คลาส Case
- Trait แบบปิดผนึก
- ชนิดข้อมูลเชิงพีชคณิต
- การจับคู่ที่ครบถ้วน