繁体   English   中英

文字函数的隐式参数

[英]Implicit parameter for literal function

在阅读游戏! 框架文档,我遇到了以下片段:

def index = Action { implicit request =>
  session.get("connected").map { user =>
    Ok("Hello " + user)
  }.getOrElse {
    Unauthorized("Oops, you are not connected")
  }
}

文档在那里implicit解释:

或者,您可以从请求中隐式检索会话

此外,我阅读了这篇文章: 具有隐式的文字,从逻辑上看,函数不能具有隐式参数。

如果我很好地弄清楚,这是因为与方法相反的function始终具有协定(接口)。

事实上,例如, Function1[Int, Function1[Int, Int]]已作为返回类型的第一个参数的Int ,从而防止我们诠释这一个为implicit 这将导致对其高级返回类型的混淆: () => IntInt => Int ...

因此,由于first Action的required参数是文字函数,因此之前的代码段具有隐式行为。

我猜想允许编译器接受此代码的原因是Action.apply()方法的多个签名:

  • def apply(block: Request[AnyContent] => Result): Action[AnyContent]
  • def apply(block: => Result): Action[AnyContent] (重定向到第一个)

由于第二个不需要某些参数,是否在存在文字函数的隐式参数的情况下选择了该参数?

考虑以下代码:

class MyImplicitClass(val session: Int)
object Tester {
  def apply(fun: MyImplicitClass => Int): Int = ???
  def apply(fun: => Int): Int = ???
}
Tester { implicit myImplicitClass => session * 20}

如果此功能:

def session(implicit myImplicitClass: MyImplicitClass): Int = myImplicitClass.session

在范围内,则第一个代码段将编译,因为很明显隐式参数myImplicitClass将传递给函数 session ,以访问字段 myImplicitClass.session ,从而允许您省略对字段的访问。 这正是玩法的窍门! 框架正在使用,请检查Controller以找到session功能。

附带说明一下,上述闭包并未说明它采用了隐式参数,这是一种语言功能,可避免必须执行以下操作:

Tester { myImplicitClass => 
  implicit val x = myImplicitClass
  session * 20
}

当要使用闭包参数作为闭包主体中的隐式值时。 另请注意,从Scala 2.9开始,此技巧仅限于带有正好1个参数的闭包。

暂无
暂无

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

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