2014-06-30 12 views
5

Hier ist der Code aus einem Beispiel:Scala Spray Routing Syntax

import spray.routing.SimpleRoutingApp 

object Main extends App with SimpleRoutingApp { 

     implicit val system = ActorSystem("my-system") 

     startServer(interface = "localhost", port = 8080) { 
      path("hello") { 
        get { 
        complete { 
         <h1>Say hello to spray</h1> 
        } 
       } 
      } 
     } 
} 

bei http://spray.io/documentation/1.1-SNAPSHOT/spray-routing/#spray-routing Gefunden

Bitte meine noobiness vergeben, wie ich von einem Java-Hintergrund kommen ... Ich versuche zu holen die Scala-Sprache sowie dieses Framework zur gleichen Zeit. Ich verstehe semantisch, was hier passiert, aber syntaktisch bin ich sehr verwirrt.

Ich möchte gerne verstehen, welche Konstrukte in der Scala-Sprache hier angewendet werden, speziell beginnend mit dem Aufruf von "startServer" und der Implementierung zwischen den {}. Auf diese Weise kann ich es googeln und recherchieren ... aber ich bin mir nicht sicher, was ich hier nachschlagen soll. Ich denke, dass es einige der funktionalen Konzepte in der Sprache verwandt sein kann.

"startServer" scheint eine Methode der SimpleRoutingApp zu sein, aber es sieht so aus, als würden Sie verschachtelte Funktionen in seinen Körper übergeben, dh "Pfad", "erhalten", "vervollständigen" ... Wie funktioniert das genau? ? Danke für die Hilfe.

Antwort

7

Spray ist nicht die einfachste Sache zu lernen, vor allem, wenn Sie gerade mit Scala begonnen haben, aber ich werde versuchen zu erklären.

Das erste, was Sie verstehen müssen, ist currying. In zwei Worten ist die Curry-Funktion eine Funktion, die eine andere Funktion zurückgibt. So startServer ist ein gutes Beispiel für eine curried Funktion, hier es verkürzte Unterschrift:

def startServer(interface: String, port: Int)(route: ⇒ Route): Future[Http.Bound] 

Dies ist eine Möglichkeit, eine curried Funktion zu erklären, nimmt start einen Host und einen Port, dann „Rückkehr“ eine Funktion, die nimmt den Schutz Ihrer Service route und gibt eine Zukunft mit Http.Bound zurück. Nächster Trick, der in Scala erlaubt ist, ist, dass Sie eine Arg-Liste in geschweiften Klammern wie {} schreiben können, und dies in startServer verwendet wird, enthält die erste Arg-Liste zwei erforderliche Parameter, so dass Sie nicht {} nur verwenden können (), aber wenn Sie host:port übergeben, haben Sie eine Funktion Route => Future[Http.Bound], so dass Sie diesen Stil anwenden können. Und diese Regel kann weiter angewendet werden (mit path, get, complete).

Was Sie im Inneren haben, das heißt

path("hello") { 
    get { 
     complete { 
      <h1>Say hello to spray</h1> 
     } 
    } 
} 

ist Ihre eigentliche Dienst Route. Es besteht aus so genannten directives, die auf der formlosen Implementierung von HList basieren (ich werde es hier nicht erklären, aber Sie können dort Informationen finden). Im Allgemeinen ist jede Direktive eine Funktion, die etwas mit dem Benutzer HttpRequest (im Grunde RequestContext) macht. Beschreibung für alle Richtlinien finden Sie here.

+0

Danke für die Hilfe! Können Sie mich auf eine Dokumentation zu diesem syntaktischen Zucker hinweisen, in der eine Methode mit einer Arg-Liste mit {} anstelle von() angewendet werden kann? Vielen Dank! – HiChews123

+1

@ acspd7 [aus Scala Buch] (http://books.google.ru/books?id=MFjNhTjeQKkC&pg=PA171&lpg=PA171&dq=Scala+eine+arg+Liste+curly+Braces&source=bl&ots=FMli-HHKvu&sig=-tX8a0dLvpaRxp_CSX6D4y11KvY&hl= ru & sa = X & ei = NZi9U6iVCsG8ygOPtoLQBA & ved = 0CEgQ6AEwBA # v = Seite & q = Scala% 20one% 20arg% 20list% 20curly% 20braces & f = false) – 4lex1v