อีนัมใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ