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

Foi útil?

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 ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top