有人能揭开这段代码的神秘面纱吗?它是Play20框架中zentasks示例的一部分。我很好奇这是如何工作的,当然,我是从Java开始接触Scala的,所以很多事情都很难理解。
def IsAuthenticated(f: => String => Request[AnyContent] => Result) =
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}发布于 2011-12-22 06:48:32
你需要把签名拆分一下。f是一个函数,它接受尚未计算的字符串=> String,并返回另一个接受Request[AnyContent]并返回结果的函数。
Security.Authenticated调用接受两个参数列表。其中一个包含username和onUnauthorized。第二个函数接受用户并返回一个操作。
Action.apply方法接受函数Request[AnyContent] => Result
因此,f以“curried”的方式被称为。也就是说,调用第一个函数,然后立即使用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的。从本质上讲,该函数进行了大量的函数组合。
发布于 2011-12-22 06:55:16
首先是我的答案的用户指南:我将使用斜体来表示未显式命名的函数(请参阅anonymous functions)。
IsAuthenticated是一种将参数f作为参数的方法。
F是一个函数,它将Y作为参数并生成结果的实例
Y是一个函数,它将Z作为参数并生成RequestAnyContent的实例
Z是一个函数,它不接受任何参数并返回一个字符串
IsAuthenticated调用Security.Authenticated,传递用户名和onUnauthorized (当用户未被授权执行所请求的操作时要调用的函数)。
我自己也不太清楚到底发生了什么--我对Scala还不是很在行--但是我猜是一个Security.Authenticated类,下面的代码相当于在java中对它进行子类化并添加一个构造函数:
{
Action(request => f(user)(request))
}如果我的大部分假设是正确的,那么操作(这是Security.Authenticated上的一个方法)将被调用,并作为参数传递一个A。
A是一个函数,它接受一个请求对象(我猜是这个类名)并产生一个结果。这里隐含了Result的用法,因为A的实现是对f的调用。
因此,当实例化Security.Authenticated的子类时,将调用操作,该操作针对某些操作(以字符串形式指定)对用户进行身份验证,如果用户通过了身份验证,则返回f(原始参数),该参数可能由操作(在上述身份验证之后)调用。这个对f的调用返回一个结果,它也是一个函数。最后,调用request (传递给A)作为参数。
https://stackoverflow.com/questions/8597028
复制相似问题