bus*_*r84 5 scala implicit playframework-2.0
我使用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)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到了同事的代码审查.他说这个代码因隐式参数而无法读取.我无法回复他的意见.那么你能告诉我使用隐式参数的最佳方法是什么?我何时应该使用隐式参数?
Rex*_*err 11
当几乎总是以"正确"的方式执行操作时,您应该使用隐式参数,并且您希望几乎始终忽略这些细节; 或者当经常无法做任何事情时,暗示为那些有效的事物提供功能.
对于第一种情况的示例scala.concurrent.Future,几乎每种方法都采用隐式方法ExecutionContext.你几乎从不关心你ExecutionContext从打电话到打电话是什么; 你只是想让它发挥作用.但是当您需要更改执行上下文时,您可以将其作为显式参数提供.
有关第二种情况的示例,请查看CanBuildFrom集合库中的s.你不能从任何东西建造任何东西; 提供了某些功能,而且缺少一个隐含的功能,比如说,允许你将一堆Vector[Option[String]]s 打包成一个HashSet[Char]是保持库强大和灵活而且理智的一种主要方式.
你没有做任何事情:显然你只是用它来节省一点点打字而牺牲另一点.而且,在这种情况下,这样做会使事情变得不那么明显,因为你必须遍布整个地方找出实际使用隐式请求的位置.如果你想保存输入,你最好使用短变量名,但要明确它:
Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }
Run Code Online (Sandbox Code Playgroud)