如何解释=>的序列?在斯卡拉?

时间:2013-08-11 18:34:16

标签: scala playframework-2.0

我目前正在开始使用play框架,但我的Scala知识还不够。

我知道=>表示IsAuthenticated具有某种函数作为参数。 我发现了f:=> String ...是一个没有输入值的函数。但是如何用3 =>来解释整行呢? ? 更进一步说,第二行中究竟发生了什么= => F(用户)(请求)?用户和请求对象的目标函数是什么?

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

2 个答案:

答案 0 :(得分:5)

=> String => Request[AnyContent] => Result
添加了parens后,

更容易阅读:

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

您可以在REPL中尝试此操作。例如:

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

在此示例中, f 是一个 nullary函数 call-by-name参数,它返回一个函数(让我们调用该函数 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'

答案 1 :(得分:0)

接受答案的几个补充

  1. 关于Security.Authenticated

    Security.Authenticated(用户名,onUnauthorized){user =>    动作(request => f(用户)(请求)) }

    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))
    }