我是新手。我曾使用过几种奇怪的(对我来说)编程语言,如python、JQuery等……有了它们,我至少可以理解一些代码段的作用。不幸的是,使用Spray,我甚至不能阅读和理解一个简单的代码。
谁能帮我读一下(用文字描述一下,代码做什么)下面的简单代码块
注意:非常高的级别,我知道,这将选择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"
}
喷雾路由是围绕Directive
的概念构建的。
您可以将Directive
视为HTTP请求上的转换。
与指令相关联的基数是在执行转换后它在转换链中传递的参数的数量。
Directive0
是一个不提供(或提取)任何参数的指令。
Directive1[A]
提供了一个类型为A
的参数。
Directive[A :: B :: HNil]
提供了两个类型分别为A
和B
的参数,或者——更准确地说——提供了一个由A
和B
组成的异构列表(实现是一个未成形的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提供的一种方式,使用返回无形状HList
的指令。hmap
需要一个函数HList
to任何东西,在这里是String
。
HList
s可以进行模式匹配,就像普通的scala List
一样,这就是您在示例中看到的。
最后,这只是从函数的角度来理解指令是如何工作的。如果您想要了解DSL语法的细节,您将不得不进一步挖掘并阅读Magnet Pattern。
我在这里找到了一个非常好的工作室。
https://www.youtube.com/watch?v=XPuOlpWEvmw