Scala Code神秘化

时间:2011-12-21 22:06:23

标签: scala playframework-2.0

有人可以揭开这段代码的神秘面纱,这是Play20框架中zentasks示例的一部分。我很好奇这是如何工作的,因为我是Java新手Scala所以很多事情很难解决。

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

2 个答案:

答案 0 :(得分:16)

您需要稍微拆分签名。 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。从本质上讲,该功能可以完成很多功能组合。

答案 1 :(得分:2)

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

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

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

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

Z 是一个不带参数并返回String

的函数

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

我不完全确定自己过去发生了什么 - 我对Scala的表现还不是很好 - 但我的猜测 就是Security.Authenticated是一个case类,以下等同于子类化它并在java中添加构造函数:

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

如果我的假设很正确,那么就会调用Action(这是Security.Authenticated的方法),将 A 作为参数传递。

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

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