不,path
不是咖喱功能。該API給出了簽名:
def path[L](pm: PathMatcher[L]): Directive[L]
Path是一個簡單的一元函數,它在PathMatcher
和返回指令。路徑似乎只是一個咖喱功能,因爲Directive
有an apply method這使得它看起來是一個函數,但它實際上是一個類。
的PathMatcher
通過導入Directives._
以下隱函數變得可用:
implicit def _segmentStringToPathMatcher(segment: String): PathMatcher0
注:PathMatcher0
定義爲PathMatcher[Unit]
,因爲它不沿所述內Route
通過匹配的值。
調用與在該示例中,path("hello")
參數路徑,類似於下面的代碼:
val directive : Directive[Unit] = path(_segmentStringToPathMatcher("hello"))
指令
如前所述,所述Directive
具有應用方法,該方法懶惰地發生在一個路線:
def apply(v1 : => Route) : Route
所以你的例子代碼本質上是馬王以下電話:
val route =
directive.apply(get {
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>"))
})
全部放在一起
讓我們簡化Route
定義和嘲笑一些邏輯來證明所發生的事情:
type SimpleRoute : HttpRequest => RouteResult
現在,我們可以寫一個使用更高階函數的路徑版本。我們更簡單的版本需要String
並返回一個函數而不是一個指令。它有點棘手,因爲返回的功能也是更高的順序:
def simplePath(pathStr : String) : SimpleRoute => SimpleRoute =
(innerRoute : SimpleRoute) => {
//this is the returned SimpleRoute
(request : HttpRequest) => {
if(request.uri.path.toString equalsIgnoreCase pathStr)
RouteResult.Complete(innerRoute(request))
else
RouteResult.Rejected(Seq.empty[Rejection])
}
}