【问题标题】:Scala Code demystifyScala 代码揭秘
【发布时间】:2012-01-25 16:34:11
【问题描述】:

谁能揭开 Play20 框架中 zentasks 示例的一部分代码的神秘面纱。我很好奇它是如何工作的,因为我是从 Java 开始接触 Scala 的新手,所以很多事情都难以理解。

def IsAuthenticated(f: => String => Request[AnyContent] => Result) = 
  Security.Authenticated(username, onUnauthorized) { user =>
    Action(request => f(user)(request))
  }

【问题讨论】:

  • 有什么方法可以用java语法来表示这个,我知道它不一样,但可以帮助我理解方法签名。我很难理解这里的操作顺序。

标签: scala playframework-2.0


【解决方案1】:

您需要稍微拆分签名。 f 是一个函数,它接受一个尚未计算的字符串 => String 并返回 另一个函数,该函数接受 Request[AnyContent] 并返回一个结果。

Security.Authenticated 调用接受 两个 参数列表。一个有usernameonUnauthorized。第二个接受一个接受用户并返回一个动作的函数。

Action.apply 方法接受一个函数Request[AnyContent] => Result

所以,f 以“咖喱”的方式被调用。也就是调用第一个函数,然后立即使用结果函数f(user)(request)

这同样是脱糖(至少,尽我所能)和丑陋的东西:

def isAuthenticated(f: => String => Request[AnyContent] => Result) =
  Security.Authenticated(username, onUnauthorized) { user: String =>
     Action.apply { request: Request[AnyContent] =>
       val hiddenTmp: Request[AnyContent] => Result = f(user)
       hiddenTemp.apply(request)
     }
  }

您可以看到编译器在删除类型注释方面做了一些工作。希望这有助于解释它是如何脱糖成原始 scala 的。本质上,函数做了很多功能组合。

【讨论】:

    【解决方案2】:

    首先是我的回答的用户指南:我将使用 斜体 来表示一个未明确命名的函数(请参阅anonymous functions)。

    IsAuthenticated 是一个将参数 f 作为参数的方法。

    f 是一个以 Y 为参数并产生 Result 实例的函数

    Y 是一个以 Z 为参数并生成 Request[AnyContent]

    实例的函数

    Z 是一个不带参数并返回字符串的函数

    IsAuthenticated 调用 Security.Authenticated,传递用户名和 onUnauthorized(当用户无权执行请求的操作时调用的函数)。

    我自己并不完全确定过去发生了什么——我对 Scala 还不是很好——但我的猜测是 Security.Authenticated 是一个case类,下面相当于继承它,在java中添加构造函数:

    {
      Action(request => f(user)(request))
    }
    

    如果我的大部分假设是正确的,那么将调用 Action(这是 Security.Authenticated 上的一个方法),并将 A 作为参数传递。

    A 是一个函数,它接受一个请求对象(我猜是这个类名)并产生一个结果。这里隐含了 Result 的使用,因为 A 的实现是对 f 的调用。

    因此,当 Security.Authenticated 的子类被实例化时,会调用 Action,它会针对某些操作(指定为字符串)对用户进行身份验证,然后如果用户通过身份验证,则返回 f(原始参数),这可能会被调用通过操作(在上述身份验证之后)。对 f 的调用返回一个 Result,它也是一个函数。然后最终以请求(已传递给A)作为参数调用结果。

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 2011-06-19
      • 2016-02-24
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2013-01-30
      相关资源
      最近更新 更多