En el siguiente ejemplo de código, no entiendo por qué la función fun se puede pasar como argumento al método addAction
. El método fun
es del tipo Unit
, mientras que el método addAction
espera una función de tipo () => Unit
.Métodos y métodos del método Scala como parámetros
Si fun
es de tipo () => Unit
, entonces ¿por qué se queja el compilador que fun
es de tipo Unit
, cuando intento agregar fun
a la lista de acciones: 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 hago. Esto ahora me parece obvio (no fue para nada en ese momento). Cuando el compilador es capaz de inferir que se espera un tipo de función, simplemente puedo escribir 'fun'; de lo contrario, tengo que explicitar que estoy aprobando una función. ¡Gracias por las claras respuestas para todos ustedes! – Manu
@Manu: Considera aceptar una respuesta que consideres que es la mejor (no necesariamente esta) –