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

pla*_*pus 28 scala implicit

我理解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)

同样,它纯粹是为了说明目的.


pla*_*pus 6

找到了一些资源:

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

/sf/answers/351061301/

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


cod*_*e4j 5

在我的理解中,关键字 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)

reqsayHitype 中声明了一个隐式参数Request[AnyContent],但是,我只能使用第一个参数调用该方法,sayHi("Jason")因为编译器填充了隐式参数 req以引用隐式变量 request