Wie würden Sie eine verzögerte (durch Name) Parameter definieren, die eine Funktion, die Parameter annimmt akzeptiert?

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

  •  19-09-2019
  •  | 
  •  

Frage

sah ich ein delayed Beispiel in David Pollak "Beginning Scala". Ich habe versucht, dass anzupassen, durch Versuch und Irrtum. Hier ist, was ich habe:

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

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

delaying(sayhello())

Wie würden Sie eine Funktion / Methode verzögern, die Parameter annimmt? Warum kann ich nicht Klammern verwenden, wenn ich t nennen? Wo finde ich weitere Dokumentation zu verzögern Funktionen finden?

War es hilfreich?

Lösung

t muss nicht ein Funktionswert sein. Es wird einfach jede bestanden-by-Name Wert, auswertet zu Unit.

Wenn Sie t in der delaying Funktion angeben, sind Sie nicht ausdrücklich den Aufruf der Funktion, die als dieser Parameter übergeben wurde. Durch die Angabe es, zwingen Sie die übergebenen-by-name-Parameter ausgewertet werden, was bedeutet, sayhello() an diesem Punkt bewertet wird.

Es gibt keinen Grund, warum Sie keine Parameter in Funktionen übergebenen-by-Name-Parameter verwenden können:

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

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

delaying(say("hello"))

Die einzige Zeit, die Sie Parameter an die t innerhalb delaying befestigen würde wäre, wenn deren Rückgabetyp war (nicht Unit aber) eine Funktion Typ Parameter.

Andere Tipps

Da ich eine schreckliche Erinnerung habe und die Antwort gibt nicht ein Beispiel, wie man tatsächlich einen by-namen Parameter erklärt, dass die Renditen eine Funktion ein oder mehr Argumente nimmt, kam ich mit diesem nach oben:

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top