Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka Http DSL指令及其工作原理_Scala_Akka_Akka Http - Fatal编程技术网

Scala Akka Http DSL指令及其工作原理

Scala Akka Http DSL指令及其工作原理,scala,akka,akka-http,Scala,Akka,Akka Http,在典型的Akka Http DSL样式中,我们有: import akka.http.scaladsl.server.Directives._ 然后在代码的后面,您可能会看到如下内容 val routes = { logRequestResult("akka-http-microservice") { pathPrefix("ip") { (get & path(Segment)) { ip => complete { fetchIpInf

在典型的Akka Http DSL样式中,我们有:

import akka.http.scaladsl.server.Directives._
然后在代码的后面,您可能会看到如下内容

val routes = {
logRequestResult("akka-http-microservice") {
  pathPrefix("ip") {
    (get & path(Segment)) { ip =>
      complete {
        fetchIpInfo(ip).map[ToResponseMarshallable] {
          case Right(ipInfo) => ipInfo
          case Left(errorMessage) => BadRequest -> errorMessage
        }
      }
    } ~
    (post & entity(as[IpPairSummaryRequest])) { ipPairSummaryRequest =>
      complete {
        val ip1InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip1)
        val ip2InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip2)
        ip1InfoFuture.zip(ip2InfoFuture).map[ToResponseMarshallable] {
          case (Right(info1), Right(info2)) => IpPairSummary(info1, info2)
          case (Left(errorMessage), _) => BadRequest -> errorMessage
          case (_, Left(errorMessage)) => BadRequest -> errorMessage
        }
      }
    }
  }
}
我没有完全理解的是,例如,
(get&path(Segment)){ip=>
中的“get”是如何被识别为MethodDirectivers trait中的方法定义的。所以我们键入“(get…”,Scala知道它来自MethodDirectivers,但如何识别?

对我来说,这似乎是Scala编译器的一个核心特性,而这对我来说并不明显

我总是对那些从Java迁移到Scala的人说,这就像皈依了一种新的宗教,有时你只需要相信;)


当我发现这一点时,我知道我会大发雷霆:(

好吧,取得了一些进展,在Scala中,你可以导入包、类、对象、实例、字段和方法。导入方法没什么大不了的,因为函数是一等公民。所以导入

import akka.http.scaladsl.server.Directives._
实际上将导入指令trait中的所有方法(如文档所示):

在上述问题中,代码使用:

logRequestResult
pathPrefix
get
path
etc ...
这些都是从这个import语句自动导入的方法,所以

logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...
如果您克隆这个项目并点击这些方法,它将带您进入定义这些方法的trait,您还将注意到,每个trait还有一个伴随对象,这使得在Scala中导入方法成为可能

对我来说不明显的Scala特性是导入方法


现在我要去踢我自己:)

仍然在研究这个问题,似乎在{}中的任何东西,比如在'val routes={…}'中,都是一个局部函数!情节变厚了我有点困惑,为什么这个问题没有被接受,可能是因为它不清楚,或者是一个如此愚蠢的问题,或者其他一些原因。