Scala for Backend Engineering & Functional Programming · Lekcja

Enumy w Scali 3

Nowa składnia enum

Lekcja 2 z 413 kroki

Enumy w Scali 3 to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Nowe słowo kluczowe enum

Scala 3 dodaje pełnoprawną konstrukcję enum. Zastępuje ona rozwlekły wzorzec sealed trait plus obiekty case ze Scali 2 zwięzłą składnią.

  • Każdy przypadek staje się wartością typu enum.
  • Kompilator automatycznie generuje przydatne elementy pomocnicze.
enum Color:
  case Red, Green, Blue

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

Wyświetlanie wszystkich wartości

Każdy prosty enum otrzymuje companion z metodami values (tablica wszystkich przypadków) i valueOf (wyszukiwanie po nazwie).

enum Color:
  case Red, Green, Blue

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

Numer porządkowy i nazwa

Każda wartość enum ma ordinal (pozycję liczoną od zera) oraz wygenerowaną metodę toString używającą nazwy przypadku.

enum Color:
  case Red, Green, Blue

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

Enumy z parametrami

Przypadki enum mogą przyjmować parametry konstruktora, dzięki czemu każda wartość może przechowywać powiązane dane. Jest to przydatne do przechowywania stałych, takich jak kody RGB lub masy planet.

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)

Metody w enumach

W ciele enuma można definiować metody. Są one dostępne dla każdej wartości, podobnie jak metody klasy.

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)

Generyczne enumy ADT

Enumy mogą być generyczne i parametryzowane, co pozwala modelować algebraiczne typy danych. Oto uproszczony typ 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)

Rekurencyjne enumy ADT

Enumy doskonale sprawdzają się w przypadku struktur rekurencyjnych. Drzewo binarne lub lista jednokierunkowa daje się przejrzyście zapisać jako zbiór przypadków.

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)

Dopasowywanie wzorców do enumów

Ponieważ enumy są sealed, kompilator może sprawdzać kompletność dopasowania match. Pominięcie przypadku powoduje ostrzeżenie.

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))

Enumy zgodne z Javą

Można dodać zachowanie extends java.lang.Enum, automatycznie wyprowadzając je z scala.reflect.Enum; w celu pełnej interoperacyjności z Javą należy napisać enum X extends Enum[X]... jednak większość kodu korzysta po prostu ze zwykłej postaci, która w razie potrzeby dobrze współdziała z Javą.

enum Suit:
  case Hearts, Diamonds, Clubs, Spades

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

Łączenie pól i metod

Można łączyć parametryzowane przypadki ze współdzielonymi metodami, tworząc rozbudowane modele domenowe.

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))

Kiedy używać enum

Warto sięgnąć po enum, gdy dostępny jest zamknięty zbiór możliwości lub algebraiczny typ danych.

  • Proste przypadki dla zwykłych wyliczeń.
  • Parametryzowane przypadki dla ADT i typów sum.
  • Automatyczne sprawdzanie kompletności ułatwia bezpieczne refaktoryzacje.
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)

Szybkie sprawdzenie

Sprawdź swoją znajomość enumów w Scali 3.

Podsumowanie

Poznał(a) Pan(i) enumy w Scali 3.

  • Zwięzły enum zastępuje powtarzalny kod sealed trait.
  • Proste enumy otrzymują values, valueOf i ordinal.
  • Przypadki mogą przyjmować parametry przechowujące powiązane dane.
  • Generyczne i rekurencyjne enumy modelują ADT.
  • Charakter sealed umożliwia kompletne dopasowywanie wzorców.
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)
Bezpłatny start

Ucz się Scala dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
143

Często zadawane pytania

Czy lekcja „Enumy w Scali 3” jest bezpłatna?

Tak — pełny tekst „Enumy w Scali 3” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Enumy w Scali 3”?

Nowa składnia enum Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?

Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Enumy w Scali 3”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?

Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Znaczące wcięcia
  2. Enumy w Scali 3
  3. Typy niejawne
  4. Typy sumy i przecięcia
← Powrót do Scala for Backend Engineering & Functional Programming