2011-10-28 15 views
11

Dato un metodo definito come segueScala Restituisce una funzione void con 0 parametri, brutta sintassi?

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

quando uso questo metodo Voglio essere in grado di scrivere

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

ma il compilatore Scala lascia solo a ottenere via con

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

che è una specie di brutto. Mi sto perdendo qualcosa qui? È possibile scriverlo nel primo modo che ho presentato?

risposta

21

Utilizzare la seguente sintassi:

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

In questo modo è possibile non solo passare funzione senza ulteriore () => (questo è chiamato passaggio per nome), ma utilizzare anche le funzioni che ritornano ogni tipo (non necessariamente Unit) . A volte è conveniente quando si dispone di una funzione esistente che si desidera passare, ma non si ha realmente a cuore il suo valore di ritorno:

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

Si noti che con questa sintassi si sta semplicemente utilizzando f, non f().

+2

Grazie Tomasz, che l'ha risolto. Per il mio esempio, funziona anche 'f: => Unit', ma la versione generica è utile sapere. – npiv

Problemi correlati