¿Cómo definiría un parámetro de retraso (por nombre) que acepta una función que toma los parámetros?
-
19-09-2019 - |
Pregunta
vi un ejemplo delayed
en "Beginning Scala"
de David Pollak. Traté de adaptación que, por ensayo y error. Aquí es lo que tengo:
def sayhello() = {
println("hello")
}
def delaying(t: => Unit):Unit = {
println("before call")
t
println("after call")
}
delaying(sayhello())
¿Cómo retrasar una función / método que toma parámetros? ¿Por qué no puedo usar los paréntesis cuando llamo t
? ¿Dónde puedo encontrar más documentación en retrasar funciones?
Solución
t
no tiene que ser un valor de la función. Se trata simplemente de cualquier pasó por nombre de valor que se evalúa como Unit
.
Cuando usted indica t
en la función delaying
, usted no está llamada explícita a la función que se pasa como parámetro. Al afirmar que, estás forzando el parámetro pasado por nombre a ser evaluados, lo que significa sayhello()
se evalúa en ese punto.
No hay ninguna razón que no puede utilizar parámetros en las funciones de los parámetros pasado-por-name:
def say(word: String) {
println(word)
}
def delaying(t: => Unit) {
println("before call")
t
println("after call")
}
delaying(say("hello"))
La única vez que le fije parámetros a la t
dentro delaying
sería si su tipo de retorno era (no Unit
pero) los parámetros que toman un tipo de función.
Otros consejos
Desde que tengo una terrible memoria y la respuesta no proporciona un ejemplo de cómo declarar en realidad un parámetro por nombre que se obtiene una función de tomar uno o más argumentos, se me ocurrió esto:
object DelayedEvalTest {
private class DelayedFunction extends Function1[Int,Unit] {
override def apply(x:Int) : Unit = {}
println("function created")
}
private def eval(eval:Boolean, op : Int => Unit ) {
println("in eval()")
if ( eval ) {
op( 42 )
}
}
private def evalDelayed(eval:Boolean, op : => Int => Unit ) {
println("in evalDelayed()")
if ( eval ) {
op( 42 )
}
}
def main(args:Array[String]) {
eval( false , new DelayedFunction() )
evalDelayed( false , new DelayedFunction() )
}
}