scala - 我什么时候应该在 Scala 中创建带有隐式参数的方法?

标签 scala playframework-2.0 implicit

我在 Scala 中使用 play 框架制作了如下所示的代码:

object Application extends Controller {
  def hoge = Action( implicit request =>
    val username = MyCookie.getName.get
    Ok("hello " + username)
  }
}

object MyCookie {
  def getName( implicit request: RequestHeader ) = {
    request.cookies.get("name").map(_.value)
  }
}

我收到了同事的代码审查。他说这段代码因为隐式参数不可读。我无法回应他的意见。那么您能告诉我使用隐式参数的最佳方法是什么吗?什么时候应该使用隐式参数?

最佳答案

当几乎总有一种“正确”的做事方式时,您应该使用隐式参数,而您几乎总是想忽略这些细节;或者当经常没有办法做事情时,隐式为那些工作的事情提供了功能。

对于第一种情况的示例,在 scala.concurrent.Future 中,几乎每个方法都采用隐式 ExecutionContext .你几乎从不关心你的 ExecutionContext是从调用到调用;你只是想让它工作。但是当您需要更改执行上下文时,您可以将其作为显式参数提供。

有关第二种情况的示例,请查看 CanBuildFrom s 在收藏库中。你不能用任何东西 build 任何东西;提供了某些功能,并且缺少隐含的功能,例如,让您打包一堆 Vector[Option[String]] s 成 HashSet[Char]是使库保持强大、灵活而又理智的一种主要方式。

你什么都不做:显然你只是用它来节省一个地方的一点打字,而牺牲另一个地方。而且,在这种情况下,这样做会使事情的工作原理变得不那么明显,因为您必须四处查看以找出隐式请求实际使用的位置。如果您想节省输入,最好使用简短的变量名称,但要明确说明:

Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }

关于scala - 我什么时候应该在 Scala 中创建带有隐式参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15248022/

相关文章:

scala - 如何在 Scala 中编写计时器角色?

scala - 无法在 Scala.IO.Source 中使用相对路径

playframework - playframework 2.0 中的动态 Action 名称

Scala:采用两个参数列表的函数对象的类型是什么?

scala - 为什么 Scala 的 toSeq 将不可变的 Set 转换为可变的 ArrayBuffer?

scala - For循环在scala : return type is "Unit"中的.map()内

java - 在 Play Framework 2 上使用 ManyToOne 字段绑定(bind)表单请求

templates - 如何在Play2中向反向路由添加参数?

scala - 为 Object 的上下文边界提供隐式证据

Scala:通用隐式转换器?