阅读并理解 spray-routing DSL

Read and understand the spray-routing DSL

我是新手喷。 我曾使用过几种奇怪的(对我而言)编程语言,如 python、JQuery 等……有了它们,我至少可以理解某些代码段的作用。 不幸的是,使用 Spray,我什至无法阅读和理解简单的代码。

有人可以帮我阅读(用文字描述,代码做什么)下面的简单代码块。

注意: 级别很高我知道,这将选择 url 参数并将它们相加。但我想要的是,清楚地理解这个代码块 crystal,因为我可以教给别人。 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"
}

spray-routing 是围绕 Directive 的概念构建的。

您可以将 Directive 视为对 HTTP 请求的转换。

与指令关联的基数是在执行转换后传递到转换链的参数数量。

Directive0 是一个不提供(或提取)任何参数的指令。

Directive1[A] 提供一个 A.

类型的参数

Directive[A :: B :: HNil] 提供 2 个类型为 AB 的参数,或者 - 更准确地说 - 提供由 A 和 [=19= 组成的异构列表](实现是 shapeless's HList)。

让我们以您的代码为例

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

您正在定义一个从 HTTP 请求中提取两个整数的新指令,即类型为 Directive[Int :: Int :: HNil]。 该实现只是利用了 spray 已经提供的指令,即 parametersparameters 是一个指令,允许从 HTTP 请求中提取查询参数并将它们转换为特定类型,在本例中,两个参数都为 Int

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

myDirective 是一个指令,它提取一个 String.

类型的参数

它的实现使用先前定义的 twoIntParameters 指令并映射其结果,对其应用转换。 在这种情况下,我们取两个 Int,将它们相加并将结果转换为 String.

那么,hmap 是怎么回事?这只是 spray of working with Directives return 一个无形的 HList 提供的一种方式。 hmap 需要一个 HList 的函数,在本例中是 String.

HLists 可以进行模式匹配,就像普通的 Scala List,这就是您在示例中看到的内容。

最后,这只是从功能的角度来看指令如何工作的想法。 如果你想了解 DSL 语法的细节,你将不得不进一步挖掘并阅读 Magnet Pattern.

在这里我发现了一个很好的工作坊

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