我正在试图理解Spray是如何实现它们的指令的,尤其是参数提取DSL。
我了解磁铁模式(勉强),但被困在ParamDefMagnet和ParamDefMagnet2是如何协同工作的。
def parameter(pdm: ParamDefMagnet): pdm.Out = pdm()
trait ParamDefMagnet {
type Out
def apply(): Out
}
trait ParamDefMagnet2[T] {
type Out
def apply(value: T): Out
}
type ParamDefMagnetAux[A, B] = ParamDefMagnet2[A] { type Out = B }
def ParamDefMagnetAux[A, B](f: A ⇒ B) = new ParamDefMagnet2[A] { type Out = B; def apply(value: A) = f(value) }我正在尝试找出如何通过下面的隐式方法将ParamDefManget2隐式地转换为ParamDefMagnet。
object ParamDefMagnet {
implicit def apply[T](value: T)(implicit pdm2: ParamDefMagnet2[T]) = new ParamDefMagnet {
type Out = pdm2.Out
def apply() = pdm2(value)
}
}如果我调用parameter("name"),如何将“ParamDefMagnet”隐式转换为名称?如果它首先将其转换为ParamDefMagnet2,那么为了将其转换为ParamDefMagnet,value: T从何而来
发布于 2015-04-24 07:51:03
因此,在深入研究了示例之后,我想我终于了解了参数函数是如何工作的:
def parameter(pdm: ParamDefMagnet): pdm.Out = pdm()以下是提取String类型参数的示例:
val p: Directive1[String] = parameter("name")
// we can then apply the function with the extracted name
p { name =>
// stuff
}Spray使用了一系列隐式转换,但基本上,如果您有一个String和一个String => Directive1[String],就可以构造一个() => Directive1[String]
// Our String => Directive1[String]
val pdm2: ParamDefMagnet2[String] { type Out = Directive1[String] } = ParamDefMagnet2.fromString
// Our () => Directive1[String]
val pdm: ParamDefMagnet { type Out = Directive1[String] } = new ParamDefMagnet {
type Out = Directive1[String]
def apply() = pdm2("name")
}
val directive: Directive1[String] = pdm()
// equivalent to:
val directive2: Directive1[String] = parameter("name")所有这些都构成了简单的parameter("name")调用:
val p: Directive1[String] = parameter("name")有关如何以DSL-ey方式应用Directive1[String]的信息,请参见How do directives work in Spray?
https://stackoverflow.com/questions/29815377
复制相似问题