我理解Scala中的隐式参数和隐式转换,但我今天第一次看到这一点:匿名函数中参数前面的隐式关键字:
Action { implicit request =>
Ok("Got request [" + request + "]")
}
隐含关键字在这里做什么?
网络上是否有资源可以更详细地描述用例?
答案 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")