Enumy w Scali 3
Nowa składnia enum
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
enumzastępuje powtarzalny kod sealed trait. - Proste enumy otrzymują
values,valueOfiordinal. - 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)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
- Znaczące wcięcia
- Enumy w Scali 3
- Typy niejawne
- Typy sumy i przecięcia