2014-06-30 2 views
5

Voici le code d'un exemple:Scala Vaporiser routage Syntaxe

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

trouvé à http://spray.io/documentation/1.1-SNAPSHOT/spray-routing/#spray-routing

S'il vous plaît pardonnez mon noobiness, comme je viens d'un milieu Java ... Je suis en train de ramasser la langue Scala ainsi que ce cadre en même temps. Je comprends sémantiquement ce qui se passe ici, mais syntaxiquement, je suis très confus.

Je voudrais comprendre ce que les constructions dans le langage Scala sont appliquées ici, spécifiquement à partir de l'appel à "startServer" et l'implémentation entre les {}. De cette façon, je peux le rechercher et le rechercher ... mais je ne suis pas sûr de ce qu'il faut rechercher ici. Je pense qu'il peut être lié certains des concepts fonctionnels dans la langue. "StartServer" semble être une méthode de SimpleRoutingApp, mais on dirait que vous passez des fonctions imbriquées dans son corps, par exemple "chemin", "get", "complete" ... Comment cela fonctionne-t-il exactement? ? Merci pour votre aide.

Répondre

7

Vaporiser n'est pas la chose la plus facile à apprendre, surtout quand vous venez de commencer avec Scala, mais je vais essayer d'expliquer.

La première chose que vous devez comprendre est currying. En deux mots, la fonction curry est une fonction qui renvoie une autre fonction. Alors startServer est un bon exemple d'une fonction cari, signature ici, il est raccourci:

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

C'est une façon de déclarer une fonction cari, startServer prend un hôte et un port, puis « retour » une fonction qui prend votre service route et renvoie un avenir avec Http.Bound. Le tour suivant qui est autorisé dans Scala, est que vous pouvez écrire une liste d'arguments dans des accolades comme {}, et ceci est utilisé dans startServer, la première liste d'arguments contient deux paramètres requis, donc vous ne pouvez pas utiliser le style {}, seulement (), mais lorsque vous passez host:port, vous avez une fonction Route => Future[Http.Bound], vous pouvez donc appliquer ce style. Et cette règle peut être appliquée plus loin (avec path, get, complete).

Qu'est-ce que vous avez à l'intérieur, i.e.

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

est votre service réel Route. Il se compose de ce qu'on appelle directives, qui sont basés sur la mise en œuvre informelle de HList (je ne vais pas l'expliquer ici, mais vous pouvez trouver des informations là-bas). En général, chaque directive est une fonction qui fait quelque chose avec l'utilisateur HttpRequest (fondamentalement RequestContext). La description de toutes les directives peut être trouvée here.

+0

Merci pour l'aide! Pouvez-vous me diriger vers une documentation sur ce sucre syntaxique dans lequel une méthode de liste à un argument peut être appliquée avec {} au lieu de()? Merci! – HiChews123

+1

@ acspd7 [à partir du livre Scala] (http://books.google.fr/books?Id=MFjNhTjeQKkC&pg=PA171&lpg=PA171&dq=Scala+one+arg+list+curly+braces&source=bl&ots=FMli-HHKvu&sig=-tX8a0dLvpaRxp_CSX6D4y11KvY&hl= ru & sa = X & ei = NZi9U6iVCsG8ygOPtoLQBA & vé = 0CEgQ6AEwBA # v = onepage & q = Scala% 20one% 20arg% 20list% 20curly% 20braces & f = false) – 4lex1v

Questions connexes