gpt4 book ai didi

scala - 文字函数的隐式参数

转载 作者:行者123 更新时间:2023-12-05 00:31:50 26 4
gpt4 key购买 nike

在阅读 Play !框架文档,我遇到了这个片段:

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

Documentation解释 implicit那里:

Alternatively you can retrieve the Session implicitly from a request



此外,我阅读了这篇文章: Literal with Implicit从逻辑上讲,函数不能有隐式参数。

如果我想通了,这是因为 功能 , 与 相反方法始终有一个契约(Contract)(接口(interface))。

确实,例如, 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] (重定向到第一个)

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

    最佳答案

    考虑以下代码:

    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 , 允许您省略字段访问。这正是 Play 的诀窍!框架正在使用,查看 Controller 找到 session功能。

    作为旁注,上面的闭包并不是说它需要一个隐式参数,它是一种语言特性,可以避免必须执行以下操作:
    Tester { myImplicitClass => 
    implicit val x = myImplicitClass
    session * 20
    }

    当一个人想要使用闭包参数作为闭包主体中的隐式值时。另请注意,从 Scala 2.9 开始,您只能使用只有 1 个参数的闭包来实现此技巧。

    关于scala - 文字函数的隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270012/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com