Hai trovato questo articolo ? Copre la nuova funzionalità legata al contesto, nel contesto dei miglioramenti degli array.
In genere, un parametro di tipo con un contesto vincolato è della forma [T: Bound]
; viene espanso in T
un parametro di tipo semplice insieme a un parametro implicito di tipo Bound[T]
.
Considera il metodo tabulate
che forma un array dai risultati dell'applicazione di una data funzione f su un intervallo di numeri da 0 fino a una data lunghezza. Fino a Scala 2.7, la tabulazione poteva essere scritta come segue:
def tabulate[T](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
In Scala 2.8 questo non è più possibile, perché le informazioni di runtime sono necessarie per creare la giusta rappresentazione di Array[T]
. È necessario fornire queste informazioni passando a ClassManifest[T]
nel metodo come parametro implicito:
def tabulate[T](len: Int, f: Int => T)(implicit m: ClassManifest[T]) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
Come forma abbreviata, è possibile utilizzare invece un vincolo di contesto sul parametro di tipo T
, fornendo:
def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}