我理解Scala中的隐式参数和隐式转换,但我今天第一次看到这个:匿名函数中参数前面的隐式关键字:
Action { implicit request =>
Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)
隐式关键字在这里做什么?
网络上是否有资源可以更详细地描述用例?
ped*_*rla 23
这里有两个截然不同的功能.
首先,request它不是方法调用中的参数.这是匿名函数的参数.匿名函数本身是方法调用的参数.
其次,在匿名函数中声明隐式参数可以方便地将val"强制"为隐式:
Action { request =>
implicit val r = request
Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)
我碰巧知道这是一个Play框架代码,但我不确定Action和Ok的签名是什么.我猜他们是这样的:
def Action(r:Request => Result):Unit
case class Ok(str:msg)(implicit r:Request)
Run Code Online (Sandbox Code Playgroud)
同样,它纯粹是为了说明目的.
在我的理解中,关键字 Implicit 的意思是Let compiler do the job
声明一个隐式变量意味着它可以用于作用域内其他方法的隐式参数。换句话说,编译器正在考虑变量来填充隐式参数。
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
Run Code Online (Sandbox Code Playgroud)
我req在sayHitype 中声明了一个隐式参数Request[AnyContent],但是,我只能使用第一个参数调用该方法,sayHi("Jason")因为编译器填充了隐式参数 req以引用隐式变量 request