Scala中匿名函数中的参数之前的隐式关键字

时间:2012-10-02 06:40:19

标签: scala implicit

我理解Scala中的隐式参数和隐式转换,但我今天第一次看到这一点:匿名函数中参数前面的隐式关键字:

Action { implicit request =>
  Ok("Got request [" + request + "]")
}

隐含关键字在这里做什么?

网络上是否有资源可以更详细地描述用例?

3 个答案:

答案 0 :(得分:23)

这里有两个截然不同的功能。

首先,request实际上并不是方法调用中的参数。这是匿名函数的参数。匿名函数本身是方法调用的参数。

其次,在匿名函数中声明一个隐式参数可以方便地避免将“强制”val变为隐式:

Action { request =>
  implicit val r = request
  Ok("Got request [" + request + "]")
}

我碰巧知道这是一个Play框架代码,但我不确定Action和Ok的签名是什么。我猜他们是这样的:

def Action(r:Request => Result):Unit
case class Ok(str:msg)(implicit r:Request)

同样,这只是纯粹的猜测,仅用于说明目的。

答案 1 :(得分:6)

找到一些资源:

https://issues.scala-lang.org/browse/SI-1492

https://stackoverflow.com/a/5015161/480674

在第二个链接上搜索“闭包中的隐式参数”

答案 2 :(得分:4)

根据我的理解,Implicit的关键字意味着让编译器完成工作

声明隐式变量意味着它可以用于作用域内其他方法的隐式参数。换句话说,编译器正在考虑变量以填充隐式参数。

{{_id}}

我在类型为 def index = Action { implicit request => val str = sayHi("Jason") Ok(views.html.index("Your new application is ready." + str)) } private def sayHi(name: String)(implicit req: Request[AnyContent]) = name + ", you can the following content" + req.body 的{​​{1}}中声明了隐式参数req,但是,我只能使用第一个参数sayHi调用该方法,因为隐式参数 Request[AnyContent]由编译器填写,以引用隐式变量 sayHi("Jason")