阅读并理解 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 个类型为 A
和 B
的参数,或者 - 更准确地说 - 提供由 A
和 [=19= 组成的异构列表](实现是 shapeless's HList
)。
让我们以您的代码为例
val twoIntParameters: Directive[Int :: Int :: HNil] =
parameters('a.as[Int], 'b.as[Int])
您正在定义一个从 HTTP 请求中提取两个整数的新指令,即类型为 Directive[Int :: Int :: HNil]
。
该实现只是利用了 spray 已经提供的指令,即 parameters
。
parameters
是一个指令,允许从 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
.
HList
s 可以进行模式匹配,就像普通的 Scala List
,这就是您在示例中看到的内容。
最后,这只是从功能的角度来看指令如何工作的想法。
如果你想了解 DSL 语法的细节,你将不得不进一步挖掘并阅读 Magnet Pattern.
在这里我发现了一个很好的工作坊
我是新手喷。 我曾使用过几种奇怪的(对我而言)编程语言,如 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 个类型为 A
和 B
的参数,或者 - 更准确地说 - 提供由 A
和 [=19= 组成的异构列表](实现是 shapeless's HList
)。
让我们以您的代码为例
val twoIntParameters: Directive[Int :: Int :: HNil] =
parameters('a.as[Int], 'b.as[Int])
您正在定义一个从 HTTP 请求中提取两个整数的新指令,即类型为 Directive[Int :: Int :: HNil]
。
该实现只是利用了 spray 已经提供的指令,即 parameters
。
parameters
是一个指令,允许从 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
.
HList
s 可以进行模式匹配,就像普通的 Scala List
,这就是您在示例中看到的内容。
最后,这只是从功能的角度来看指令如何工作的想法。 如果你想了解 DSL 语法的细节,你将不得不进一步挖掘并阅读 Magnet Pattern.
在这里我发现了一个很好的工作坊