Прочтите и поймите DSL-маршрутизацию распыления

Я новичок в спреях. Я работал с несколькими странными (для меня) языками программирования, такими как python, JQuery и т. д. С ними я мог хотя бы понять, что делает какой-то сегмент кода. К сожалению со спреем я не могу прочитать и понять даже простой код.

Может ли кто-нибудь помочь мне прочитать (описать словом, что делает код) следующий простой блок кода.

Примечание. Очень высокий уровень, который я знаю, это выберет параметр URL и сложит их вместе. Но чего я хочу, так это ясно понять этот блок кода, как я мог бы научить кого-то еще. HNil, Directive1, Directive1, :: для меня несколько странные.

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

val myDirective: Directive1[String] =
  twoIntParameters.hmap {
    case a :: b :: HNil => (a + b).toString
  }

// test `myDirective` using the testkit DSL
Get("/?a=2&b=5") ~> myDirective(x => complete(x)) ~> check {
  responseAs[String] === "7"
}

person Janaka Priyadarshana    schedule 16.09.2015    source источник


Ответы (2)


спрей-маршрутизация основана на концепции Directive. .

Вы можете думать о Directive как о преобразовании HTTP-запроса.

Мощность, связанная с директивой, — это количество аргументов, которые передаются по цепочке преобразования после выполнения преобразования.

Directive0 — это директива, которая не предоставляет (или не извлекает) никаких аргументов.

Directive1[A] предоставляет один аргумент типа A.

Directive[A :: B :: HNil] предоставляет 2 аргумента типов A и B, или, если быть более точным, предоставляет гетерогенный список, состоящий из A и B (реализация представляет собой shapeless HList).

Давайте рассмотрим примеры в вашем коде

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

Вы определяете новую директиву, которая извлекает два целых числа из HTTP-запроса, то есть имеет тип Directive[Int :: Int :: HNil]. Реализация просто использует директиву, уже предоставленную спреем, то есть parameters. parameters — это директива, которая позволяет извлекать параметры запроса из HTTP-запроса и преобразовывать их в определенный тип, в данном случае Int для обоих параметров.

val myDirective: Directive1[String] =
  twoIntParameters.hmap {
    case a :: b :: HNil => (a + b).toString
  }

myDirective — это директива, которая извлекает один параметр типа String.

Его реализация использует ранее определенную директиву twoIntParameters и сопоставляет ее результат, применяя к нему преобразование. В этом случае мы берем два Int, суммируем их и превращаем результат в String.

Итак, что с hmap? Это просто способ, предоставляемый брызгами работы с директивами, которые возвращают бесформенное HList. hmap требуется функция, которая HList ни к чему, в данном случае String.

HLists могут быть сопоставлены с шаблоном, как обычный scala List, и это то, что вы видите в примере.

Наконец, это просто идея того, как директивы работают с функциональной точки зрения. Если вы хотите разобраться в тонкостях синтаксиса DSL, вам придется копнуть немного глубже и прочитать о Магнитный шаблон.

person Gabriele Petronella    schedule 16.09.2015
comment
Это верно...? 1) Определение директивы (Directive[Int :: Int :: HNil] ) всегда содержит информацию о параметрах, которые она возвращает (извлекает) 2) И всегда ее вводом является HTTP-запрос (RequestContext) - person Janaka Priyadarshana; 01.10.2015

Здесь я нашел очень хорошую мастерскую.

https://www.youtube.com/watch?v=XPuOlpWEvmw

person Janaka Priyadarshana    schedule 01.10.2015