这是一个例子中的代码:
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的一种方法,但看起来你将嵌套函数传递到它的主体,即"路径","获取","完整"......这究竟是如何工作的?谢谢你的帮助.
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)有关的函数.所有指令的描述都可以在这里找到.