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

การ์ดและการผูกค่า

เงื่อนไขในการจับคู่

การ์ดและการผูกค่า เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

Guard คืออะไร

Guard คือเงื่อนไขบูลีนที่เพิ่มให้กับ case โดยใช้ if กรณีจะจับคู่ได้ก็ต่อเมื่อรูปแบบตรงกันและ guard เป็นจริง

Guard ช่วยแบ่งรูปแบบเดียวออกเป็นกรณีย่อยที่ละเอียดขึ้นตามค่าที่จับคู่

การเพิ่ม Guard ด้วย if

เขียน guard ต่อจากรูปแบบดังนี้: case n if n > 0 => หากเงื่อนไขเป็นเท็จ ระบบจะตรวจสอบกรณีถัดไป

object Main {
  def sign(n: Int): String = n match {
    case x if x > 0 => "positive"
    case x if x < 0 => "negative"
    case _          => "zero"
  }
  def main(args: Array[String]): Unit = {
    println(sign(5))
    println(sign(-3))
    println(sign(0))
  }
}

การผูกค่าแล้วตรวจสอบ Guard

Guard สามารถอ้างอิงชื่อที่คุณผูกไว้ในรูปแบบได้ นี่คือวิธีตรวจสอบคุณสมบัติของค่าที่จับคู่

object Main {
  def fizz(n: Int): String = n match {
    case x if x % 15 == 0 => "FizzBuzz"
    case x if x % 3 == 0  => "Fizz"
    case x if x % 5 == 0  => "Buzz"
    case x                => x.toString
  }
  def main(args: Array[String]): Unit = {
    println(fizz(15))
    println(fizz(9))
    println(fizz(7))
  }
}

Guard กับช่วงค่า

Guard เหมาะอย่างยิ่งสำหรับช่วงค่า ซึ่งรูปแบบค่าคงที่ไม่สามารถแสดงได้โดยตรง

object Main {
  def band(score: Int): String = score match {
    case s if s >= 90 => "A"
    case s if s >= 80 => "B"
    case s if s >= 70 => "C"
    case _            => "F"
  }
  def main(args: Array[String]): Unit = {
    println(band(95))
    println(band(83))
    println(band(60))
  }
}

การผูกรูปแบบด้วย @

สัญลักษณ์ @ จะผูกค่าที่จับคู่ทั้งหมดไว้กับชื่อหนึ่ง ขณะเดียวกันก็ยังจับคู่โครงสร้างของค่าได้

ในที่นี้ whole @ pattern หมายถึง จับคู่กับ pattern และเรียกค่าที่จับคู่ได้ว่า whole

object Main {
  def main(args: Array[String]): Unit = {
    val x: Any = 7
    val msg = x match {
      case n @ (_: Int) => s"int value is $n"
      case _            => "other"
    }
    println(msg)
  }
}

การผูกค่าในคอลเลกชัน

การผูกค่าด้วย @ มีประโยชน์เป็นพิเศษกับรูปแบบที่มีโครงสร้าง เช่น การเก็บรายการทั้งรายการไว้พร้อมกับตรวจสอบสมาชิกตัวแรก

object Main {
  def describe(xs: List[Int]): String = xs match {
    case all @ (first :: _) => s"starts with $first, full = $all"
    case Nil                => "empty"
  }
  def main(args: Array[String]): Unit = {
    println(describe(List(1, 2, 3)))
    println(describe(Nil))
  }
}

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

คุณสามารถผสมรูปแบบตามชนิดข้อมูลกับ guard ได้ โดยระบบจะตรวจสอบชนิดข้อมูลก่อน แล้วจึงตรวจสอบเงื่อนไขบูลีน

object Main {
  def label(x: Any): String = x match {
    case s: String if s.length > 3 => "long string"
    case s: String                 => "short string"
    case _                         => "not a string"
  }
  def main(args: Array[String]): Unit = {
    println(label("hello"))
    println(label("hi"))
    println(label(42))
  }
}

หลายเงื่อนไข

Guard เป็นนิพจน์บูลีน ดังนั้นคุณจึงรวมเงื่อนไขด้วย && และ || ได้

object Main {
  def category(age: Int): String = age match {
    case a if a >= 13 && a <= 19 => "teen"
    case a if a < 13             => "child"
    case _                       => "adult"
  }
  def main(args: Array[String]): Unit = {
    println(category(15))
    println(category(8))
    println(category(40))
  }
}

Guard ไม่ทำงานต่อในกรณีถัดไปโดยอัตโนมัติ

หากรูปแบบตรงกันแต่ guard เป็นเท็จ Scala จะไปยังกรณีถัดไป ไม่ใช่ guard ถัดไปของรูปแบบเดิม

ตรวจสอบให้แน่ใจว่ากรณีภายหลังสามารถรองรับค่าที่ไม่ผ่าน guard ทุกข้อได้

object Main {
  def test(n: Int): String = n match {
    case x if x > 100 => "big"
    case x            => s"not big: $x"
  }
  def main(args: Array[String]): Unit = {
    println(test(200))
    println(test(5))
  }
}

เหตุใดจึงใช้ Guard และการผูกค่า

เมื่อใช้ร่วมกัน guard และการผูกค่าด้วย @ ทำให้การจับคู่รูปแบบสื่อความหมายได้มากขึ้น:

  • Guard เพิ่มเงื่อนไข เช่น ช่วงค่าและการหารลงตัว
  • @ เก็บค่าทั้งหมดไว้พร้อมกับแยกโครงสร้างภายใน
  • ช่วยให้ตรรกะการแตกแขนงกระชับและอ่านง่าย

นำทุกอย่างมารวมกัน

ตัวอย่างนี้ผูกค่า ตรวจสอบ guard และมีกรณีสำรอง

object Main {
  def temp(c: Int): String = c match {
    case t if t >= 30 => s"hot ($t)"
    case t if t >= 15 => s"mild ($t)"
    case t            => s"cold ($t)"
  }
  def main(args: Array[String]): Unit = {
    println(temp(35))
    println(temp(20))
    println(temp(5))
  }
}

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับ guard และการผูกค่า

สรุปทบทวน

คุณได้เรียนรู้การปรับการจับคู่ให้ละเอียดขึ้น:

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

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

บทเรียน “การ์ดและการผูกค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การ์ดและการผูกค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การ์ดและการผูกค่า” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

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

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

  1. นิพจน์ match
  2. การจับคู่ชนิดและค่า
  3. การ์ดและการผูกค่า
  4. การแยกโครงสร้าง
← กลับไปที่ Scala for Backend Engineering & Functional Programming