首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala代码揭秘

Scala代码揭秘
EN

Stack Overflow用户
提问于 2011-12-22 06:06:23
回答 2查看 1.7K关注 0票数 10

有人能揭开这段代码的神秘面纱吗?它是Play20框架中zentasks示例的一部分。我很好奇这是如何工作的,当然,我是从Java开始接触Scala的,所以很多事情都很难理解。

代码语言:javascript
复制
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = 
  Security.Authenticated(username, onUnauthorized) { user =>
    Action(request => f(user)(request))
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-22 06:48:32

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

Security.Authenticated调用接受两个参数列表。其中一个包含usernameonUnauthorized。第二个函数接受用户并返回一个操作。

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

因此,f以“curried”的方式被称为。也就是说,调用第一个函数,然后立即使用f(user)(request)生成的函数。

下面是相同的去丑化(至少,尽我所能)和丑陋的东西:

代码语言:javascript
复制
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的。从本质上讲,该函数进行了大量的函数组合。

票数 16
EN

Stack Overflow用户

发布于 2011-12-22 06:55:16

首先是我的答案的用户指南:我将使用斜体来表示未显式命名的函数(请参阅anonymous functions)。

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

F是一个函数,它将Y作为参数并生成结果的实例

Y是一个函数,它将Z作为参数并生成RequestAnyContent的实例

Z是一个函数,它不接受任何参数并返回一个字符串

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

我自己也不太清楚到底发生了什么--我对Scala还不是很在行--但是我猜是一个Security.Authenticated类,下面的代码相当于在java中对它进行子类化并添加一个构造函数:

代码语言:javascript
复制
{
  Action(request => f(user)(request))
}

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8597028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档