Директивы Акка Http DSL, как это работает - PullRequest
0 голосов
/ 06 ноября 2018

В типичном стиле 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' в (get & path(Segment)) { ip => распознается как метод def из черты MethodDirectives. Итак, мы набираем '(get ...', и Scala знает, что это из MethodDirectives, но как?

Мне кажется, что то, что делает эту работу, является основной особенностью компилятора Scala, которая не очевидна для меня.

Я всегда говорю, что людям, переходящим с Java на Scala, все равно, что переходить в новую религию, иногда нужно просто верить;)

Я знаю, что пну себя, когда узнаю: (

1 Ответ

0 голосов
/ 08 ноября 2018

Хорошо, достигнут некоторый прогресс, оказывается, что в Scala вы можете импортировать такие вещи, как пакеты, классы, объекты, экземпляры, поля и методы. Импорт методов не имеет большого значения, так как функции являются гражданами первого класса. Так что импорт

import akka.http.scaladsl.server.Directives._

Фактически импортирует все методы из черты Директив (как следует из документации):

В приведенном выше вопросе код использует:

logRequestResult
pathPrefix
get
path
etc ...

Это все методы, которые автоматически импортируются из этого единственного оператора импорта, поэтому

logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...

Если вы клонируете этот проект образец приложения и щелкнете по этим методам, вы перейдете к чертам, где они определены, и вы также заметите, что каждая черта имеет также объект-компаньон, который является что делает возможным импорт методов в Scala.

Особенностью Scala, которая мне не была очевидна, был методы импорта !

Теперь я пойду и пну себя:)

...