Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin · Oppitunti

Enumit Scalassa 3

Uusi enum-syntaksi.

Oppitunti 2/413 vaihetta

Enumit Scalassa 3 on ilmainen Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssilla on yhteensä 4 oppituntia.

Uusi enum-avainsana

Scala 3 lisää ensiluokkaisen enum-rakenteen. Se korvaa Scala 2:n pitkän sealed-trait- ja case object -mallin tiiviillä syntaksilla.

  • Jokaisesta tapauksesta tulee enum-tyypin arvo.
  • Kääntäjä generoi hyödyllisiä apumetodeja automaattisesti.
enum Color:
  case Red, Green, Blue

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

Kaikkien arvojen luetteleminen

Jokainen yksinkertainen enum saa companion-objektin, jossa ovat values (kaikkien tapausten taulukko) ja valueOf (haku nimen perusteella).

enum Color:
  case Red, Green, Blue

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

Järjestysnumero ja nimi

Jokaisella enum-arvolla on ordinal (nollasta alkava sijainti) ja generoitu toString, joka käyttää tapauksen nimeä.

enum Color:
  case Red, Green, Blue

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

Parametreja sisältävät enumit

Enum-tapaukset voivat vastaanottaa konstruktoriparametreja, jolloin kuhunkin arvoon voidaan liittää dataa. Tämä on hyödyllistä esimerkiksi RGB-koodien tai planeettojen massojen tallentamiseen.

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)

Enumien metodit

Voit määritellä metodeja enum-rungon sisällä. Ne ovat käytettävissä kaikilla arvoilla samaan tapaan kuin luokan metodit.

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)

Geneeriset ADT-enumit

Enumit voivat olla geneerisiä ja parametrisoituja, joten niiden avulla voi mallintaa algebrallisia tietotyyppejä. Tässä on yksinkertaistettu Option-tyyppi.

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)

Rekursiiviset ADT-enumit

Enumit sopivat erinomaisesti rekursiivisiin rakenteisiin. Binääripuu tai linkitetty lista voidaan esittää selkeästi tapausjoukkona.

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)

Enumien hahmonsovitus

Koska enumit ovat suljettuja, kääntäjä voi tarkistaa match-lauseen kattavuuden. Puuttuvasta tapauksesta annetaan varoitus.

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

Java-yhteensopivat enumit

Lisää extends java.lang.Enum -käyttäytyminen johtamalla automaattisesti tyypistä scala.reflect.Enum; todellista Java-yhteentoimivuutta varten kirjoita enum X extends Enum[X]... mutta useimmissa tapauksissa käytetään tavallista muotoa, joka toimii tarvittaessa hyvin yhdessä Javan kanssa.

enum Suit:
  case Hearts, Diamonds, Clubs, Spades

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

Kenttien ja metodien yhdistäminen

Voit yhdistää parametrisoidut tapaukset ja jaetut metodit monipuolisten toimialuemallien rakentamiseksi.

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

Milloin enumia kannattaa käyttää

Käytä enum-rakennetta, kun sinulla on suljettu joukko vaihtoehtoja tai algebrallinen tietotyyppi.

  • Yksinkertaiset tapaukset tavallisiin luettelotyyppeihin.
  • Parametrisoidut tapaukset ADT- ja summatyyppeihin.
  • Automaattiset kattavuustarkistukset tekevät refaktoroinnista turvallista.
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)

Pikatarkistus

Testaa, miten hyvin ymmärrät Scala 3:n enumit.

Kertaus

Opit Scala 3:n enumit.

  • Tiivis enum korvaa sealed-trait-boilerplaten.
  • Yksinkertaiset enumit saavat metodit values, valueOf ja ordinal.
  • Tapaukset voivat vastaanottaa parametreja niihin liittyvää dataa varten.
  • Geneeriset ja rekursiiviset enumit mallintavat ADT-tyyppejä.
  • Suljettu rakenne mahdollistaa kattavan hahmonsovituksen.
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)
Aloita maksutta

Opi Scala tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
143

Usein kysytyt kysymykset

Onko oppitunti ”Enumit Scalassa 3” ilmainen?

Kyllä – oppitunnin ”Enumit Scalassa 3” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssin, päivitä CoddyKit PROhon. Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Enumit Scalassa 3”?

Uusi enum-syntaksi. Harjoittelet Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Enumit Scalassa 3”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunnilla?

Kyllä. Jokainen Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Merkityksellinen sisennys
  2. Enumit Scalassa 3
  3. Opaakit tyypit
  4. Yhdiste- ja leikkaustyypit
← Takaisin: Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin