0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

การจับคู่ที่ครบถ้วน

คอมไพเลอร์ตรวจสอบความครบถ้วน

การจับคู่ที่ครบถ้วน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คลาส Case
  2. Trait แบบปิดผนึก
  3. ชนิดข้อมูลเชิงพีชคณิต
  4. การจับคู่ที่ครบถ้วน
← กลับไปที่ Scala for Backend Engineering & Functional Programming