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

อีนัมใน Scala 3

ไวยากรณ์ enum แบบใหม่

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

คีย์เวิร์ด enum แบบใหม่

Scala 3 เพิ่มโครงสร้าง enum อย่างเป็นทางการ ซึ่งแทนรูปแบบ sealed-trait กับ case-object ที่มีไวยากรณ์ยืดยาวใน Scala 2 ด้วยไวยากรณ์ที่กระชับ

  • แต่ละ case จะกลายเป็นค่าของชนิด enum
  • คอมไพเลอร์จะสร้างตัวช่วยที่มีประโยชน์ให้อัตโนมัติ
enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    println(Color.Red)

การแสดงค่าทั้งหมด

enum แบบง่ายทุกชนิดจะมีออบเจกต์คู่มาพร้อมกับ values (อาร์เรย์ของทุก case) และ valueOf (ค้นหาจากชื่อ)

enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    Color.values.foreach(println)
    println(Color.valueOf("Green"))

ลำดับและชื่อ

ค่า enum แต่ละค่ามี ordinal (ตำแหน่งที่เริ่มนับจากศูนย์) และมี toString ที่สร้างขึ้นโดยใช้ชื่อ case

enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    println(Color.Blue.ordinal)
    println(Color.Red.ordinal)

Enum พร้อมพารามิเตอร์

case ของ enum รับ พารามิเตอร์ของตัวสร้างได้ ทำให้แต่ละค่ามีข้อมูลประกอบ เหมาะสำหรับเก็บค่าคงที่ เช่น รหัส RGB หรือมวลของดาวเคราะห์

enum Planet(val mass: Double):
  case Earth extends Planet(5.97e24)
  case Mars  extends Planet(6.42e23)

object Main:
  def main(args: Array[String]): Unit =
    println(Planet.Earth.mass)
    println(Planet.Mars.mass)

เมธอดใน Enum

คุณสามารถกำหนดเมธอดภายในเนื้อหา enum ได้ เมธอดเหล่านี้ใช้ได้กับทุกค่า เช่นเดียวกับเมธอดในคลาส

enum Direction:
  case North, South, East, West
  def opposite: Direction = this match
    case North => South
    case South => North
    case East  => West
    case West  => East

object Main:
  def main(args: Array[String]): Unit =
    println(Direction.North.opposite)

Enum ADT แบบทั่วไป

Enum สามารถเป็น ชนิดทั่วไปและรับพารามิเตอร์ได้ ทำให้ใช้สร้างแบบจำลองชนิดข้อมูลพีชคณิตได้ นี่คือตัวอย่างชนิด Option แบบย่อ

enum Maybe[+A]:
  case Just(value: A)
  case Nothing

object Main:
  def main(args: Array[String]): Unit =
    val a: Maybe[Int] = Maybe.Just(42)
    println(a)

Enum ADT แบบเรียกซ้ำ

Enum เหมาะอย่างยิ่งกับโครงสร้างแบบเรียกซ้ำ ต้นไม้ไบนารีหรือรายการเชื่อมโยงสามารถเขียนให้อ่านง่ายเป็นชุดของ case ได้

enum Tree[+A]:
  case Leaf(value: A)
  case Branch(left: Tree[A], right: Tree[A])

object Main:
  def main(args: Array[String]): Unit =
    val t = Tree.Branch(Tree.Leaf(1), Tree.Leaf(2))
    println(t)

การจับคู่รูปแบบบน Enum

เนื่องจาก enum เป็น sealed คอมไพเลอร์จึงสามารถ ตรวจสอบความครอบคลุมทุกกรณีของ match ได้ หากขาด case ใดไป จะมีคำเตือนเกิดขึ้น

enum Light:
  case Red, Yellow, Green

object Main:
  def action(l: Light): String = l match
    case Light.Red    => "stop"
    case Light.Yellow => "slow"
    case Light.Green  => "go"

  def main(args: Array[String]): Unit =
    println(action(Light.Green))

Enum ที่เข้ากันได้กับ Java

เพิ่มพฤติกรรม extends java.lang.Enum ด้วยการสืบทอดจาก scala.reflect.Enum โดยอัตโนมัติ สำหรับการทำงานร่วมกับ Java อย่างแท้จริง ให้เขียน enum X extends Enum[X]... แต่โค้ดส่วนใหญ่ใช้รูปแบบธรรมดาซึ่งทำงานร่วมกับ Java ได้ดีเมื่อจำเป็น

enum Suit:
  case Hearts, Diamonds, Clubs, Spades

object Main:
  def main(args: Array[String]): Unit =
    println(Suit.values.length)
    println(Suit.Spades.ordinal)

การรวมฟิลด์และเมธอด

คุณสามารถผสม case ที่มีพารามิเตอร์เข้ากับเมธอดร่วม เพื่อสร้างแบบจำลองโดเมนที่มีรายละเอียดมากขึ้น

enum Currency(val symbol: String):
  case USD extends Currency("$")
  case EUR extends Currency("\u20ac")
  def format(amount: Double): String = s"$symbol$amount"

object Main:
  def main(args: Array[String]): Unit =
    println(Currency.USD.format(9.99))

ควรใช้ enum เมื่อใด

เลือกใช้ enum เมื่อคุณมีชุดตัวเลือกที่ปิดตายตัว หรือมีชนิดข้อมูลพีชคณิต

  • ใช้ case แบบง่ายสำหรับการแจกแจงค่าทั่วไป
  • ใช้ case ที่มีพารามิเตอร์สำหรับ ADT และชนิดผลรวม
  • การตรวจสอบความครอบคลุมทุกกรณีโดยอัตโนมัติช่วยให้การปรับโครงสร้างปลอดภัย
enum Result[+E, +A]:
  case Ok(value: A)
  case Err(error: E)

object Main:
  def main(args: Array[String]): Unit =
    val r: Result[String, Int] = Result.Ok(7)
    println(r)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเรื่อง enum ใน Scala 3

สรุป

คุณได้เรียนรู้ enum ใน Scala 3

  • enum ที่กระชับเข้ามาแทนโค้ดประกอบของ sealed-trait
  • Enum แบบง่ายมี values, valueOf และ ordinal
  • Case สามารถรับพารามิเตอร์สำหรับข้อมูลประกอบ
  • Enum แบบทั่วไปและแบบเรียกซ้ำใช้สร้างแบบจำลอง ADT ได้
  • ความเป็น sealed ช่วยให้จับคู่รูปแบบได้ครบทุกกรณี
enum Weekday:
  case Mon, Tue, Wed, Thu, Fri
  def isStart: Boolean = this == Mon

object Main:
  def main(args: Array[String]): Unit =
    println(Weekday.Mon.isStart)
    println(Weekday.values.length)

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

บทเรียน “อีนัมใน Scala 3” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “อีนัมใน Scala 3” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “อีนัมใน Scala 3”

ไวยากรณ์ enum แบบใหม่ คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “อีนัมใน Scala 3” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การย่อหน้าที่มีความหมาย
  2. อีนัมใน Scala 3
  3. ชนิดข้อมูลทึบแสง
  4. ชนิดข้อมูลยูเนียนและอินเตอร์เซกชัน
← กลับไปที่ Scala for Backend Engineering & Functional Programming