Nell'esempio di codice seguente, non capisco perché la funzione fun può essere passata come argomento al metodo addAction
. Il metodo fun
è di tipo Unit
, mentre il metodo addAction
prevede una funzione di tipo () => Unit
.Tipi di metodi Scala e metodi come parametri
Se fun
è di tipo () => Unit
, allora perché il compilatore si lamentano che fun
è di tipo Unit
, quando provo ad aggiungere alla lista fun
azioni: actions = fun :: actions
?
package myscala
object MyScala {
def fun() { println("fun1 executed.") }
def addAction(a:() => Unit) {
actions = a :: actions
}
var actions: List[() => Unit] = List()
def main(args: Array[String]) {
// the following line would produce a compiler error (found: Unit, required:() => Unit), it's OK
// actions = fun :: actions
actions = (() => fun) :: actions // OK
// I would expect the same compiler error here (found: Unit, required:() => Unit), but it's OK why?
addAction(fun)
actions.foreach(_()) // prints twice "fun1 executed"
}
}
Sì, lo so. Questo ora mi sembra ovvio (non lo era affatto in quel momento). Quando il compilatore è in grado di dedurre che un tipo di funzione è previsto, posso semplicemente scrivere 'fun', altrimenti devo esplicitare che sto passando una funzione. Grazie per le risposte chiare a tutti voi! – Manu
@Manu: considera di accettare una risposta che consideri la migliore (non necessariamente questa) –