2011-10-28 4 views
11

donné une méthode définie comme suitScala Retour d'une fonction vide avec 0 paramètres, syntaxe laide?

def descendEach(times:Int)(f:()=>Unit) { 
     for (i <- 1 to times) { 
      // other code 
      f() 
     } 
    } 

quand j'utilise cette méthode que je veux être en mesure d'écrire

gd.descendEach(20){ 
    println(gd.cost) 
} 

mais le compilateur scala me laisse seulement sortir avec

gd.descendEach(20){() => 
    println(gd.cost) 
} 

qui est un peu moche. Est-ce que j'ai râté quelque chose? Est-il possible de l'écrire de la première manière que j'ai présentée?

Répondre

21

Utilisez la syntaxe suivante:

def descendEach[T](times:Int)(f: => T) 

De cette façon, vous ne pouvez pas passer uniquement fonction sans () => supplémentaire (ce qu'on appelle passe par nom), mais aussi utiliser les fonctions renvoyant tout type (pas nécessairement Unit) . Il est parfois pratique lorsque vous avez une fonction existante que vous voulez passer, mais ne se soucient pas vraiment de sa valeur de retour:

def g() = 42 
descendEach(20)(g) 

Notez que cette syntaxe que vous utilisez simplement f, pas f().

+2

Merci Tomasz, qui l'a corrigé. Pour mon exemple, il suffit de faire 'f: => Unit', mais la version générique est pratique à connaître. – npiv