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