2016-09-28 2 views
0

Wenn Sie sehen, Code, der dieses Muster folgt:Anonyme Funktionen mit Parametern

def index = Action { request => 
    // .. 
} 

Aktion Merkmal: https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/mvc/Action.scala#L65

Wenn an diesem Code suchen, wie würden Sie wissen, dass das Request-Objekt verfügbar ist innerhalb zu verwenden der Codeblock? (Gibt es eine Intellij Abkürzung dafür?)

Kann jemand bitte ein Miniatur-Beispiel erstellen, wo Sie dieses Muster nachahmen können, damit ich verstehen kann, wie das funktioniert, und wenn Sie in technischen Begriffen erklären können, was vor sich geht?

Antwort

1

Dies nennt man als Loan pattern

withWriter einen Schriftsteller für den Benutzer erstellt und sorgt dann für die Ressource (Drehbuch) nach der Verwendung richtig eng ist.

, dass alle Benutzer zu tun haben, verwenden wird nur die writer und schreiben etwas in die Datei

def withWriter(file: File)(f: Writer => Unit): Unit = { 
    val writer = new PrintWriter(file) 
    try { 
    f(writer) 
    } finally { 
    writer close 
    } 
} 

Verbrauch:

withWriter(new File("some_fix.txt") { writer => 
    writer println("write something") 
} 
+0

sind Sie sicher, dass es ein Darlehen Muster ist da, dass auf jeden Fall relevant wäre Ressourcenmanagement? Ich habe keine Quelle gelesen, aber [diese Seite] (https://www.playframework.com/documentation/2.5.x/ScalaActions) erwähnt nur, dass es eine Funktion akzeptiert –

3

Das ActionMerkmal ist hier nicht von Interesse. Stattdessen, weil der Körper der index Methode ein Wert sein muss, kein Typ, suchen Sie am ActionObjekt. Sie können mehr über Objekte lernen here. Lassen Sie uns zuerst die Syntax vereinfachen, indem wir syntaktischen Zucker entfernen, d. H. Das Programm sich gleich verhalten, aber mit einfacheren Konstrukten. Wenn Sie versuchen, ein Objekt zu nennen, als ob es sich um eine Methode waren, wirklich das, was passiert ist, dass .apply vom Compiler für Sie eingefügt:

def index = Action.apply((request) => { 
    // .. 
}) 

Dies kann besser vertraut; Die apply-Methode wird für das Objekt Action aufgerufen, wobei eine Lambda-Funktion übergeben wird, die eine Anforderung entgegennimmt. Und offensichtlich ist ein Argument für ein Lambda immer innerhalb dieses Lambda verfügbar. Das ist der Sinn von ihnen. Das Lambda wird in diesem Fall auch als Callback bezeichnet. Ein einfaches Beispiel, das diese Funktionen verdeutlicht folgt:

object WithAnswer { 
    def apply(f: Int => Unit): Unit = 
    f(42) 
} 

def printAnswer() = WithAnswer { answer => 
    println(answer) 
} 
+0

Danke. Ja, du gibst eine Anfrage an das Lambda und du kannst es also innerhalb der Lamba verwenden, ich gehe dahin. Aber woher wissen Sie, welche Parameter verfügbar sind? Kann IntelliJ mir das leicht sagen oder? –

+0

in Ihrem Beispiel haben Sie den Parameter "Antwort", was ist das? –

+0

Es ist die Ganzzahl, die 'WithAnswer.apply' an das Lambda übergibt. – rightfold

Verwandte Themen