5

我在 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)
  }
}

我从同事那里得到了代码审查。他说由于隐含参数,这段代码不可读。我无法回应他的意见。那么你能告诉我使用隐式参数的最佳方法是什么吗?什么时候应该使用隐式参数?

4

1 回答 1

11

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

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

对于第二种情况的示例,请查看CanBuildFromcollections 库中的 s。你不能从任何东西中建造任何东西;Vector[Option[String]]提供了某些功能,并且缺少隐式,例如,让您将一堆s打包成 aHashSet[Char]是保持库强大和灵活但理智的一种主要方式。

你什么都没有做:显然你只是用它来节省在一个地方打字的时间,而牺牲了另一个地方。而且,在这种情况下,这样做会使事情的工作方式变得不那么明显,因为您必须到处寻找才能确定隐式请求实际使用的位置。如果你想节省打字,你最好使用短变量名,但要明确:

Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }
于 2013-03-06T13:12:29.273 回答