Come definirebbe un parametro di ritardo (per nome) che accetta una funzione che prende i parametri?

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

  •  19-09-2019
  •  | 
  •  

Domanda

Ho visto un esempio delayed in "Beginning Scala" di David Pollak. Ho cercato di adattare tale, per tentativi ed errori. Ecco quello che ho:

def sayhello() = {
  println("hello")
}

def delaying(t: => Unit):Unit = {
  println("before call")
  t
  println("after call")
}

delaying(sayhello())

Come ti ritardare una funzione / metodo che accetta i parametri? Perché non posso usare parantheses quando chiamo t? Dove posso trovare maggiori documentazione sulle funzioni ritardare?

È stato utile?

Soluzione

t non deve essere un valore della funzione. Si tratta semplicemente di qualsiasi passato-by-nome del valore che restituisce Unit.

Quando si stato t nella funzione delaying, non stai chiamando esplicitamente la funzione che è stato passato come quel parametro. Affermando che, si stanno costringendo il parametro passato per nome da valutare, il che significa che sayhello() viene valutata in quel punto.

Non c'è ragione per cui non è possibile utilizzare i parametri nelle funzioni di parametri passati per nome:

def say(word: String) {
  println(word)
}

def delaying(t: => Unit) {
  println("before call")
  t
  println("after call")
}

delaying(say("hello"))

L'unica volta che ci si collegare i parametri al t all'interno delaying sarebbe se il suo tipo di ritorno è stato (non Unit ma) un tipo funzione di parametri taking.

Altri suggerimenti

Dal momento che ho un ricordo terribile e la risposta non fornisce un esempio come dichiarare in realtà un parametro per nome che produce una funzione di prendere uno o più argomenti, mi si avvicinò con questo:

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top