我目前正在开始使用play框架,但我的Scala知识还不够。
我知道=>表示IsAuthenticated具有某种函数作为参数。 我发现了f:=> String ...是一个没有输入值的函数。但是如何用3 =>来解释整行呢? ? 更进一步说,第二行中究竟发生了什么= => F(用户)(请求)?用户和请求对象的目标函数是什么?
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
答案 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)
接受答案的几个补充
关于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)
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) }
)
此外,似乎可以使用curring来调用构造函数:
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
Action(f(user))
}