chi*_*one 10 scala playframework-2.0
有人可以揭开这段代码的神秘面纱,这是Play20框架中zentasks示例的一部分.我很好奇这是如何工作的,因为我是Java的Scala新手所以很多东西都难以理解.
def IsAuthenticated(f: => String => Request[AnyContent] => Result) =
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
Run Code Online (Sandbox Code Playgroud)
jsu*_*eth 16
你需要稍微分开签名.f是一个函数,它接受一个尚未计算的字符串,=> String并返回另一个接受a Request[AnyContent]并返回结果的函数.
该Security.Authenticated调用接受两个参数列表.一个有username和onUnauthorized.第二个接受一个接受用户并返回动作的功能.
该Action.apply方法接受一个函数Request[AnyContent] => Result
因此,f以"咖喱"的方式被称为.这是第一个调用的函数,然后立即使用生成的函数f(user)(request).
这是同样的事情(至少,尽我所能)和丑陋:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到编译器在删除类型注释方面做了一些工作.希望这有助于解释它如何消化为原始scala.从本质上讲,该功能可以做很多功能组合.
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |