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
. Naprimjercase even()
- Ako vraća jednu pod-vrijednost tipa
T
, vraćaOption[T]
- Ako vraća više pod-vrijednosti
T1,...,Tn
, grupiše ih u opcionu torkuOption[(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:
Contents
- Uvod
- Osnove
- Sjedinjeni tipovi
- Klase
- Podrazumijevane vrijednosti parametara
- Imenovani parametri
- Trejtovi
- Tuples
- Kompozicija mixin klasa
- Funkcije višeg reda
- Ugniježdene metode
- Curry-jevanje
- Case klase
- Podudaranje uzoraka (pattern matching)
- Singlton objekti
- Regularni izrazi
- Ekstraktor objekti
- For komprehensije
- Generičke klase
- Varijanse
- Gornja granica tipa
- Donja granica tipa
- Unutarnje klase
- Apstraktni tipovi
- Složeni tipovi
- Self-tipovi
- Implicitni parametri
- Implicitne konverzije
- Polimorfne metode
- Lokalno zaključivanje tipova (type inference)
- Operatori
- By-name parametri
- Anotacije
- Packages and Imports
- Package Objects