首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读并理解喷雾路由DSL。

问阅读并理解喷雾路由DSL。
EN

Stack Overflow用户
提问于 2015-09-16 12:06:27
回答 2查看 313关注 0票数 1

我刚开始喷水。我使用过一些奇怪的编程语言,如python、JQuery等.有了它们,我至少可以理解一些代码段所做的事情。不幸的是,使用喷雾,我甚至无法阅读和理解一个简单的代码。

有谁能帮我读一下下面的简单代码块(用单词描述,代码是做什么的)。

注意:我知道级别很高,这将选择url参数并将它们相加在一起。但是我想要的是,清楚地理解这个代码块,就像我可以教别人一样。HNil, Directive1, Directive1, ::对我来说有些奇怪。

代码语言:javascript
复制
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"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 12:29:43

喷雾路由是围绕着Directive的概念建立的.

您可以将Directive看作是对HTTP请求的转换。

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

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

Directive1[A]提供了一个类型为A的参数。

Directive[A :: B :: HNil]提供了两个类型为A和B的参数,或者更准确地说,提供了一个由A和B组成的异构列表(实现是一个HList)。

让我们以代码中的示例为例

代码语言:javascript
复制
val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

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

代码语言:javascript
复制
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语法的细节,那么您必须进一步挖掘并阅读有关磁铁图案的内容。

票数 3
EN

Stack Overflow用户

发布于 2015-10-01 12:20:35

在这里,我发现了一个非常好的车间。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32608144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档