4

我目前从 play framework 开始,但我的 Scala 知识还不够。

据我所知, => 表明 IsAuthenticated 具有某种功能作为参数。我还发现 f: => String... 是一个没有输入值的函数。但是我如何用它的 3 => 来解释完整的行呢?再往下看,第二行的 => f(user)(request) 到底发生了什么?用户和请求对象的目标函数是什么?

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

2 回答 2

5
=> String => Request[AnyContent] => Result

添加括号更容易阅读:

=> (String => (Request[AnyContent] => Result))

你可以在 REPL 中试试这个。例如:

scala> def foo(f: => String => Int => Char): Char = f("abcdefgh")(4)
foo: (f: => String => (Int => Char))Char

在此示例中,f是一个返回函数的空函数按名称调用参数(让我们调用该函数g)。g是一个接受 String 参数并返回另一个函数 ( h ) 的函数。h是一个接受 Int 参数并返回 Char 的函数。

示例调用:

scala> foo { s: String => { i: Int => s.charAt(i) } }
res0: Char = e

让我们来看看方法体中每个表达式的类型,因为它被评估:

  • f
    • 类型:String => (Int => Char)
    • 价值:{ s: String => { i: Int => s.charAt(i) } }
  • f("abcdefgh")
    • 类型:Int => Char
    • 价值:{ i: Int => "abcdefgh".charAt(i) }
  • f("abcdefgh")(4)
    • 类型:Char
    • 价值:'e'
于 2013-08-11T19:11:23.677 回答
0

对已接受答案的一些补充

  1. 关于Security.Authenticated

    Security.Authenticated(username, onUnauthorized) { user => Action(request => f(user)(request)) }

    Security.Authenticated - 似乎是一个接受两个参数列表的函数。第一个参数列表:

    (username:String, onUnauthorized:Boolean)
    

    第二个列表是一个参数:

    (g:User => Action)
    

    完整的签名可以是这样的:

    def Authenticated(username:String, onUnauthorized:Boolean)(g:User => Action)
    
  2. Action似乎是一个在其构造函数中采用函数的类:

    class Action(h:Request => Result)
    

    构造函数的参数是一个新函数

    def hActual(request:Request):Result = f(user)(request)
    

    def应该user在范围内,因为它没有在参数中给出。例如,hActual可以在Action构造函数调用之前立即声明:

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

    )

  3. 此外,似乎可以使用curring调用构造函数:

    def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
        Action(f(user))
    }
    
于 2013-08-13T17:03:26.530 回答