W poniższym przykładzie kodu, nie rozumiem, dlaczego funkcja fun może być przekazana jako argument do metody addAction
. Sposób jest następujący: , a sposób według wynalazku wymaga funkcji typu .Metody i metody metod Scala jako parametry
Jeśli fun
jest typu () => Unit
, to dlaczego kompilator skarżą się, że fun
jest typu Unit
, gdy próbuję dodać fun
do listy czynności: 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"
}
}
Tak, robię. Teraz wydaje mi się to oczywiste (w ogóle wtedy nie było). Kiedy kompilator jest w stanie wywnioskować, że oczekiwany jest typ funkcji, mogę po prostu napisać "fun", w przeciwnym razie muszę wyraźnie zaznaczyć, że przekazuję funkcję. Dzięki za jasne odpowiedzi dla was wszystkich! – Manu
@Manu: Rozważ zaakceptowanie odpowiedzi, którą uważasz za najlepszą (niekoniecznie tę) –