Scala" def函数= Type {"意思?

时间:2014-06-04 22:38:41

标签: scala playframework-2.0

我正在使用Play 2.x并在动作处理程序中找到以下语法,例如

object Application extends Controller { 
    /**
     * Index action handler
     */
    def index = Action { implicit request => 
      Ok(Json.obj("one" -> "two"))
    }
}

这里我理解除= Action之外的所有东西,它不是函数的类型,因为函数返回类型是play.api.mvc.Result。那么= Action是什么意思?

为了让理解更加糟糕,我现在介绍了身份验证,并根据示例将我的应用程序更改为:

object Application extends Controller with Secured { 
    /**
     * Index action handler
     */
    def index = IsAuthenticated { username => implicit request => 
      Ok(Json.obj("one" -> "two"))
    }
}

这有效,但为什么不再需要Action?它有必要吗?我如何组合这些类型中的几种(无论它们是什么意思):ActionDBActionIsAuthenticated等?

2 个答案:

答案 0 :(得分:2)

Action不是类型,它是一个函数。如果是类型,则index的签名看起来像

def index: Action = { implicit request =>

请注意添加:=

的位置

相关的documentation表示行动是

  

处理请求并生成要发送的结果的函数   客户

如您所知,您正在返回play.api.mvc.Result

答案 1 :(得分:0)

好的,现在感谢同事了解它是什么。该语法只是意味着返回一个对象,在这种情况下是一个类型为Action的对象,并且该操作将构造函数作为一个函数,该函数将一个Request作为输入并返回一个SimpleResult,它可以被重写为例如

object Application extends Controller { 
    /**
     * Index action handler
     */
     def index : Action[AnyContent] = { 
         Action(implicit request => Ok(Json.obj("one" -> "two")))
     }
 }

让它真正令人困惑的是,在Scala中,它们可以在一定程度上模糊地在括号和大括号之间切换。因此,实现它不是我正在查看的函数体,而是一个动作的构造函数参数(这是一个匿名函数),这很难实现