Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候应该在Scala中创建具有隐式参数的方法?_Scala_Playframework 2.0_Implicit - Fatal编程技术网

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

什么时候应该在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

我使用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: 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) }

可能是重复的感谢布赖恩。你是对的。