什么时候应该在Scala中创建具有隐式参数的方法?
我使用scala中的play framework编写了如下代码:什么时候应该在Scala中创建具有隐式参数的方法?,scala,playframework-2.0,implicit,Scala,Playframework 2.0,Implicit,我使用scala中的play framework编写了如下代码: object Application extends Controller { def hoge = Action( implicit request => val username = MyCookie.getName.get Ok("hello " + username) } } object MyCookie { def getName( implicit request: Request
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。你不能用任何东西来建造任何东西;提供了某些功能,并且缺少一个隐式函数,比如说,可以将一堆Vector[Option[String]]
s打包成HashSet[Char]
,这是保持库功能强大、灵活但又健康的一个主要方法
你两个都没有做:显然你只是用它来节省一点打字时间,而牺牲了另一点。在本例中,这样做会使事情的工作方式变得不那么明显,因为您必须四处寻找,以找出隐式请求实际被使用的位置。如果要节省键入,最好使用简短的变量名,但要明确:
Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }
可能是重复的感谢布赖恩。你是对的。