Scala喷涂路由语法

HiC*_*123 5 scala spray

这是一个例子中的代码:

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>
                    }
                 }
             }
       }
}
Run Code Online (Sandbox Code Playgroud)

发现于http://spray.io/documentation/1.1-SNAPSHOT/spray-routing/#spray-routing

请原谅我的高兴,因为我来自Java背景......我正在尝试同时获取Scala语言以及此框架.我在语义上理解这里发生了什么,但从语法上来说,我很困惑.

我想了解Scala语言中的哪些构造在这里应用,特别是从调用"startServer"开始,以及{}之间的实现.这样我可以谷歌并研究它...但我不知道该在这里查找什么.我认为这可能与该语言中的一些功能概念有关.

"startServer"似乎是SimpleRoutingApp的一种方法,但看起来你将嵌套函数传递到它的主体,即"路径","获取","完整"......这究竟是如何工作的?谢谢你的帮助.

4le*_*x1v 7

Spray不是最容易学习的东西,特别是当你刚开始使用Scala时,我会尝试解释.

你需要了解的第一件事是currying.用两个词来说,curried函数是一个返回另一个函数的函数.这startServer是一个curry函数的一个很好的例子,这里缩短了签名:

def startServer(interface: String, port: Int)(route: ? Route): Future[Http.Bound]
Run Code Online (Sandbox Code Playgroud)

这是一种声明curried函数的方法,startServer接受一个主机和一个端口,然后"返回"一个函数,它接受你的服务route并返回一个未来Http.Bound.Scala中允许的下一个技巧是,你可以在花括号中编写一个arg列表{},并使用它startServer,第一个arg列表包含两个必需参数,所以你不能{}只使用样式(),但是当你通过时host:port,你有一个功能Route => Future[Http.Bound],所以你可以应用这种风格.这条规则可以进一步应用(有path,get,complete).

你在里面有什么,即

path("hello") {
    get {
      complete {
          <h1>Say hello to spray</h1>
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

是你的实际服务路线.它由所谓的指令组成,它们基于HList的无形实现(我不会在这里解释它,但你可以在那里找到信息).通常,每个指令都是一个与用户HttpRequest(基本上是RequestContext)有关的函数.所有指令的描述都可以在这里找到.