繁体   English   中英

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

[英]Implicit keyword before a parameter in anonymous function in Scala

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

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

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

Web上是否有资源描述用例是什么?

这里有两个不同的功能。

首先, 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)

再次,这纯粹是出于说明目的。

找到了一些资源:

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

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

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

在我的理解中,隐式关键字的意思是让编译器完成任务

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

 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM