¿Cómo definiría un parámetro de retraso (por nombre) que acepta una función que toma los parámetros?

StackOverflow https://stackoverflow.com/questions/1909026

  •  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?

¿Fue útil?

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() )
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top