我是新手。 我和几个奇怪的(对我来说)编程语言一样工作,比如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"
}
答案 0 :(得分:3)
喷涂路由是围绕Directive
的概念构建的。
您可以将Directive
视为对HTTP请求的转换。
与指令关联的基数是在执行转换后向下传递变换链的参数数量。
Directive0
是一个不提供(或提取)任何参数的指令。
Directive1[A]
提供了A
类型的一个参数。
Directive[A :: B :: HNil]
提供了A
和B
类型的2个参数,或者 - 更准确地说 - 提供了由A
和B
组成的异构列表(实施是shapeless's 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
。
HList
可以进行模式匹配,就像普通的scala List
一样,这就是你在示例中看到的内容。
最后,这只是一个关于指令如何从功能的角度运作的想法。 如果您想了解DSL语法的详细信息,您将需要进一步深入了解并阅读Magnet Pattern。
答案 1 :(得分:0)
我在这里找到了一个非常好的研讨会。