Você achou este artigo ? Ele cobre o novo recurso de limite de contexto, dentro do contexto de melhorias de array.
Geralmente, um parâmetro de tipo com um limite de contexto é do formulário [T: Bound]
; ele é expandido para um parâmetro de tipo simples T
junto com um parâmetro implícito de tipo Bound[T]
.
Considere o método tabulate
que forma uma matriz a partir dos resultados da aplicação de uma dada função f em um intervalo de números de 0 até um determinado comprimento. Até Scala 2.7, tabular poderia ser escrito da seguinte forma:
def tabulate[T](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
No Scala 2.8 isso não é mais possível, porque as informações de tempo de execução são necessárias para criar a representação correta do Array[T]
. É necessário fornecer essas informações passando um ClassManifest[T]
para o método como um parâmetro implícito:
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
}
Como uma forma abreviada, um limite de contexto pode ser usado no parâmetro de tipo T
, fornecendo:
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
}