scala - 没有类型的隐式参数

标签 scala playframework implicit

为什么以下 Play 语法有效

def handleForm = Action(parse.tolerantFormUrlEncoded) { implicit request =>
  val username = request.body.get("username").map(_.head).getOrElse("");
  Ok("Username was " + username)
}

如果不指定请求类型,编译器如何知道如何解析隐式请求?

最佳答案

Play 中的 Action 可以被视为一个函数:Request[A] => Result。 Action 的内部定义类似于 trait Action[A] extends EssentialAction

类型A实际上是允许您在其中放置任何内容的类型。从代码中可以看到,Request的定义是这样的:trait Request[+A] extends RequestHeader。这里有趣的是加号 (+)。这就是所谓的协变注释。这个协变类型参数是允许随着类的子类型化而向下变化的。这意味着如果你有类似的东西

特征列表[+A]

那么 List[Int]List[AnyVal] 的子类型,因为 IntAnyVal 的子类型>。这意味着当需要 List[AnyVal] 类型的值时,您可以提供 List[Int] 的实例。

所有这些都允许您拥有一个 super 通用的请求,作为您操作的基础,因此不会出现编译时问题。


从与用户更相关的角度来看,为什么这一切都是必要的:

来自 Play Scala 文档:

It is often useful to mark the request parameter as implicit so it can be implicitly used by other APIs that need it:

Action { implicit request =>
  Ok("Got request [" + request + "]")
}

关于scala - 没有类型的隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379326/

相关文章:

java - mysql 在 playframework 的子句中查询

java - Play Framework Cache Api 注入(inject)在单例中返回空指针异常

java - 无法使用 JPA 持久保存 HashMap

scala - 在宏扩展时生成函数

python - 求解 3 个变量的隐式二次系统

scala - 诊断 Scala 编译错误 "value to is not a member of Int"

用于构建简单计算器示例的 Scala 解析器

Scala SBT 如何同时运行测试和测试

scala - 以 Ordering[T] 为界的类型参数 T

list - 如何按以下方式组合非对称列表