2009-10-05 10 views
2

J'ai écrit mon premier exemple de programme scala et il ressemble à ceci:Scala parenthèses supplémentaires Impression

def main(args: Array[String]) {  
    def f1 = println("aprintln") 
    println("applying f1") 
    println((f1 _).apply) 
    println("done applying f1") 
} 

La sortie est

applying f1 
aprintln 
() 
done applying f1 

Quelqu'un peut-il expliquer pourquoi le supplément() apparaît? Je pensais que juste aprintln apparaîtrait.

grâce,

Jeff

Répondre

5

Cela corrigera le problème:

def main(args: Array[String]) {   
    def f1 = println("aprintln") 
    println("applying f1") 
    (f1 _).apply 
    println("done applying f1") 
}

Et ce que cela:

def main(args: Array[String]) {   
    def f1 = "aprintln" 
    println("applying f1") 
    println((f1 _).apply) 
    println("done applying f1") 
}

Qu'est-ce qui se passe ici est que vous exécutez la fonction f1 avec l'appel à apply. La fonction f1 imprime 'aprintln' et renvoie (). Vous passez ensuite la sortie de f1, qui est (), à un autre appel à println. C'est pourquoi vous voyez une paire supplémentaire de parans sur la console.

Les parenthèses vides ont le type Unit dans Scala, ce qui équivaut à void dans Java.

+0

Ah, oui, très bête de moi. Je n'y ai pas pensé puisque le compilateur Java ne m'aurait pas laissé faire ça. Je vous remercie. –

2

méthodes qui auraient un type de retour de vide dans Java ont un type de retour d'unité Scala.() est comment vous écrivez la valeur de l'unité.

Dans votre code, f1 appelle println directement. Ainsi, lorsque vous appelez f1 et que vous passez son résultat à println, vous imprimez une chaîne dans le corps de f1 et vous imprimez son résultat, qui doit être suivi de().

+0

Fait sens et est en accord avec l'autre réponse. Je vous remercie. –