字面功能隐含参数(Implicit parameter for literal function)

2019-07-18 02:22发布

在阅读播放! Framework文档,我遇到了这个片断:

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

文档解释implicit有:

另外,您可以从请求隐含检索会话

此外,我看到这篇文章: 文字与隐 ,它似乎在逻辑上是功能不能有隐含参数。

如果我也想通了,这是因为一个函数 ,违背方法始终合同(接口)。

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

因此,什么前面的代码段与内隐的行为,因为第一个Action的所需的参数是文字功能。

我猜让编译器接受这段代码的多个签名的原因Action.apply()方法:

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

由于第二并不需要一些参数,这是一个在字面函数的隐含参数的选择存在?

Answer 1:

考虑下面的代码:

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
}

当一个人想要使用一个闭合参数作为封闭件的主体的隐式值。 另外请注意,由于斯卡拉2.9的,你是有限的封闭与这一招正好1参数。



文章来源: Implicit parameter for literal function