Scala extra de parênteses impressão
Pergunta
Eu escrevi o meu primeiro programa de exemplo scala e parece que isso:
def main(args: Array[String]) {
def f1 = println("aprintln")
println("applying f1")
println((f1 _).apply)
println("done applying f1")
}
A saída é
applying f1
aprintln
()
done applying f1
Alguém pode explicar por que aparece extra ()? Pensei apenas aprintln iria aparecer.
graças,
Jeff
Solução
Isto irá corrigir o problema:
def main(args: Array[String]) {
def f1 = println("aprintln")
println("applying f1")
(f1 _).apply
println("done applying f1")
}
E assim será este:
def main(args: Array[String]) {
def f1 = "aprintln"
println("applying f1")
println((f1 _).apply)
println("done applying f1")
}
O que está acontecendo aqui é que você está executando a função f1
com a chamada para apply
. A função f1
imprime 'aprintln', e retorna ()
. Você, então, passar a saída do f1
, que é ()
, a outra chamada para println
. É por isso que você vê um par extra de Parans no console.
Os parênteses vazios têm a Unidade tipo em Scala, o que equivale a anular em Java.
Outras dicas
Os métodos que teriam um tipo de retorno vazio em Java tem um tipo de retorno da Unidade em Scala. () É a forma como você escreve o valor da unidade.
Em seu código, f1 chamadas println diretamente. Então, quando você chamar f1 e passar o resultado para println, você quer imprimir uma corda no corpo de f1, e imprimir seu resultado, que é tostring'ed como ().