0

这是从 Play Framework 附带的示例中提取的动作组合

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

所以,Security.Authenticated取一个username: RequestHeader => Option[String]onAuthorized: RequestHeader=>SimpleResult第二组括号取String => Action[A]

然后在控制器中我有:

def index = isAuthenticated { ...code }}  

上面的代码是这样的,所以我假设这是f函数=> String => Request[AnyContent] => Result。现在,我不明白这里到底发生了什么。我不是在谈论User.findByEmail....,我是在谈论username => _ => ...。如果我直接调用这个函数的签名会是什么样子?

username => _ =>
    User.findByEmail(username).map { user =>
      Ok(
        html.dashboard(
          Project.findInvolving(username), 
          Task.findTodoInvolving(username), 
          user
        )
      )
    }.getOrElse(Forbidden)  

如果有def isAuthenticated(f: => Request[AnyContent] => Result)我会知道如何使用它,我会理解它。但是额外的“数据”让我感到困惑。

更新:

我想我发现了一些东西:

def f2: String => Int => List[Char] = x => _ => x.toList  

这将被称为:

f2("Andrew")(2) //there can be anything replacing 2 because I don't have access to it anyway  

因此,我主要询问的上述功能将是:

def f: => String => Request[AnyContent] => Result = username => _ => User.find.....  

我对吗?
我收到“此处不允许使用名称参数错误”。

如果他们不使用第二个参数,他们为什么要使用String => Request => Result而不是简单地使用String => Result

4

2 回答 2

1

该函数定义实际上是一个柯里化函数定义。

String => Request => Result实际上的意思是:f(s:String):(r:Request)=>Result即一个接受一个字符串并返回一个接受一个请求并返回一个结果的函数的函数。

查看“增加你的功能”部分:http ://danielwestheide.com/blog/2013/01/30/the-neophytes-guide-to-scala-part-11-currying-and-partially-applied-functions .html

于 2013-05-25T17:31:28.493 回答
0

对我来说, https://github.com/mariussoutier/PlayBasics/tree/master/play-2.2-migration上的示例非常有启发性。

于 2014-02-13T09:41:05.230 回答