首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >喷雾中的FormFieldMagnet是如何工作的?

喷雾中的FormFieldMagnet是如何工作的?
EN

Stack Overflow用户
提问于 2013-10-14 09:20:51
回答 1查看 217关注 0票数 1

我很清楚喷雾器中磁铁的作用是多么的容易,但是在FieldDefMagnet中所有的转换和引申都会让我的大脑受到打击。这是资料来源的一部分

代码语言:javascript
复制
def formField(fdm: FieldDefMagnet): fdm.Out = fdm()

trait FieldDefMagnet {
  type Out
  def apply(): Out
}
object FieldDefMagnet {
  implicit def apply[T](value: T)(implicit fdm2: FieldDefMagnet2[T]) = new FieldDefMagnet {
    type Out = fdm2.Out
    def apply() = fdm2(value)
  }
}
trait FieldDefMagnet2[T] {
  type Out
  def apply(value: T): Out
}
object FieldDefMagnet2 {
  implicit def apply[A, B](implicit fdma: FieldDefMagnetAux[A, B]) = new FieldDefMagnet2[A] {
    type Out = B
    def apply(value: A) = fdma(value)
  }
}

trait FieldDefMagnetAux[A, B] extends (A ⇒ B)

因此,例如,当我调用formField("name") scalac在FieldDefMagnet.apply("name")中封装"name"时,如何选择和应用其他关联呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 10:28:50

是的,它从FieldDefMagnet.apply开始,然后继续查找apply方法的内嵌,以此类推。

粗略地说,FieldDefMagnet是1)一个带有隐式功能注释的值,3)是从该功能返回的类型。

FieldDefMagnet2只是返回类型的类型成员的隐式功能。

FieldDefMagnetAux只是为Out类型成员提供了一个更简单的语法。它也可以写成(也许我们应该这样做)

代码语言:javascript
复制
type FieldDefMagnetAux[A, B] = FieldDefMagnet2[A] { type Out = B }

这种结构基本上是用来指导类型推断,使scala编译器推断出大多数类型参数。

所有“有趣”的内容都发生在FieldDefMagnetAux中,其中对于不同类型的输入类型,相应的功能被计算出来。

编辑:要查看它的实际运行情况,请考虑将formField("name")扩展为

代码语言:javascript
复制
formField(
    FieldDefMagnet.apply[String]("name")(
      FieldDefMagnet2.apply[String, Directive1[String]](
        FieldDefMagnetAux.forString(
          Deserializer.fromRequestUnmarshaller[spray.http.HttpForm](
            Deserializer.fromMessageUnmarshaller[spray.http.HttpForm](
              Deserializer.formUnmarshaller(
                Deserializer.UrlEncodedFormDataUnmarshaller, Deserializer.MultipartFormDataUnmarshaller))), 
          FormFieldConverter.dualModeFormFieldConverter[String](
            Deserializer.liftToSourceOption[String, String](
              Deserializer.fromFunction2Converter[String, String](Predef.conforms[String])), 
            Deserializer.liftFromEntityOptionUnmarshaller[String](
              Deserializer.liftToSourceOption[spray.http.HttpEntity, String](
                Deserializer.StringUnmarshaller)))))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19357058

复制
相关文章

相似问题

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