我刚开始喷水。我使用过一些奇怪的编程语言,如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"
}发布于 2015-09-16 12:29:43
喷雾路由是围绕着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是怎么回事?这只是通过使用返回非形状HList的指令而提供的一种方法。hmap需要一个HList到任何东西的函数,在本例中是String。
HList的模式可以匹配,就像普通的scala List一样,这就是您在示例中看到的。
最后,这只是从功能的角度来了解指令是如何工作的。如果您想了解DSL语法的细节,那么您必须进一步挖掘并阅读有关磁铁图案的内容。
发布于 2015-10-01 12:20:35
在这里,我发现了一个非常好的车间。
https://stackoverflow.com/questions/32608144
复制相似问题