Scala Code神秘化

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调用接受两个参数列表.一个有usernameonUnauthorized.第二个接受一个接受用户并返回动作的功能.

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.从本质上讲,该功能可以做很多功能组合.