Tour of Scala

Ekstraktor objekti

Language

Ekstraktor objekat je objekat koji ima unapply metodu. Dok je apply metoda kao konstruktor koji uzima argumente i kreira objekat, unapply metoda prima objekat i pokušava vratiti argumente. Ovo se najčešće koristi u podudaranju uzoraka i parcijalnim funkcijama.

import scala.util.Random object CustomerID { def apply(name: String) = s"$name--${Random.nextLong()}" def unapply(customerID: String): Option[String] = { val name = customerID.split("--").head if (name.nonEmpty) Some(name) else None } } val customer1ID = CustomerID("Sukyoung") // Sukyoung--23098234908 customer1ID match { case CustomerID(name) => println(name) // prints Sukyoung case _ => println("Could not extract a CustomerID") } 

Metoda apply kreira CustomerID string od argumenta name. Metoda unapply radi suprotno da dobije name nazad. Kada pozovemo CustomerID("Sukyoung"), to je skraćena sintaksa za CustomerID.apply("Sukyoung"). Kada pozovemo case CustomerID(name) => customer1ID, ustvari pozivamo unapply metodu.

Metoda unapply se može koristiti i za dodjelu vrijednosti.

val customer2ID = CustomerID("Nico") val CustomerID(name) = customer2ID println(name) // prints Nico 

Ovo je ekvivalentno val name = CustomerID.unapply(customer2ID).get. Ako se uzorak ne podudari, baciće se scala.MatchError izuzetak:

val CustomerID(name2) = "--asdfasdfasdf" 

Povratni tip od unapply se bira na sljedeći način:

  • Ako je samo test, vraća Boolean. Naprimjer case even()
  • Ako vraća jednu pod-vrijednost tipa T, vraća Option[T]
  • Ako vraća više pod-vrijednosti T1,...,Tn, grupiše ih u opcionu torku Option[(T1,...,Tn)].

Ponekad, broj pod-vrijednosti nije fiksan i želimo da vratimo listu. Iz ovog razloga, također možete definisati uzorke pomoću unapplySeq koja vraća Option[Seq[T]]. Ovaj mehanizam se koristi naprimjer za uzorak case List(x1, ..., xn).

Contributors to this page: