加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 文字函数的隐式参数

发布时间:2020-12-16 18:11:51 所属栏目:安全 来源:网络整理
导读:在阅读Play时!框架文档,我遇到了这个片段: def index = Action { implicit request = session.get("connected").map { user = Ok("Hello " + user) }.getOrElse { Unauthorized("Oops,you are not connected") }} Documentation解释隐含在那里: Alternati
在阅读Play时!框架文档,我遇到了这个片段:

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

Documentation解释隐含在那里:

Alternatively you can retrieve the Session implicitly from a request

此外,我读了这篇文章:Literal with Implicit,从逻辑上看,函数不能有隐含参数.

如果我很清楚,这是因为一个函数,与方法相反总是一个契约(接口).

实际上,例如,Function1 [Int,Int]]具有返回类型的第一个参数Int,因此阻止我们将这个参数注释为隐式.这会导致对其高级返回类型的混淆:()=> Int或Int =>国际…

因此,前一个代码段代码的行为是隐式的,因为第一个Action的必需参数是一个文字函数.

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

> def apply(块: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将被传递给函数会话以访问字段myImplicitClass.session,允许您省略字段访问.这正是Play的伎俩!框架正在使用,检查Controller以查找会话功能.

作为旁注,上面的闭包并没有声明它需要一个隐式参数,它是一种语言功能,以避免必须执行以下操作:

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

当一个人想要使用一个闭包参数作为闭包体内的隐含值.另请注意,从Scala 2.9开始,您只能使用具有1个参数的闭包.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读