我做了Scala中使用游戏框架,它看起来像下面的代码:
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)
}
}
我从我的同事代码审查。 他说,这个代码是因为隐含参数的不可读。 我不能回答他的意见。 所以,你能告诉我什么是使用隐含参数的最佳方法是什么? 什么时候应该使用隐含参数?
你应该使用隐式参数时,几乎总是存在一个“正确”的方式做事情,并且希望几乎忽略这些细节所有的时间; 或者经常有没有办法做的事情,和implicits为那些工作的事情的功能。
对于第一种情况的一个例子,在scala.concurrent.Future
,几乎每一个方法需要一个隐式ExecutionContext
。 你几乎从来不在乎你的什么ExecutionContext
是从电话呼叫; 你只是希望它的工作。 但是,当你需要改变执行上下文可以提供其作为一个明确的参数。
对于第二种情况的一个例子,请看CanBuildFrom
S IN的集合库。 你不能建立任何东西从什么; 某些功能提供的,并且缺乏一个隐含的是,说,让你包了一堆Vector[Option[String]]
s转换为HashSet[Char]
是保持库功能强大,灵活而健全的一个重要途径。
你正在做的既不是:显然你只是用它来保存在一个地方一点点打字另一点的费用。 而且,在这种情况下,这样做,你做了它不太明显的事情是如何工作的,因为你必须看所有的地方在那里隐式的请求最终被用来弄清楚。 如果你想节省打字,你就要去使用短变量名,但显式说明它要好得多:
Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }