Scala什么是;def函数=类型{“平均值”?

Scala什么是;def函数=类型{“平均值”?,scala,playframework-2.0,Scala,Playframework 2.0,我正在使用Play2.x,在动作处理程序中发现了以下语法,例如 object Application extends Controller { /** * Index action handler */ def index = Action { implicit request => Ok(Json.obj("one" -> "two")) } } 在这里,除了=Action之外,我什么都懂,它不是函数的类型,因为函数返回

我正在使用Play2.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
DBAction
是否已验证
等?

Action
不是一个类型,而是一个函数。如果它是一个类型,则
索引的签名将类似

def索引:操作={隐式请求=>

注意添加了
=

相关国家的行动是

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


正如您所注意到的,您正在返回一个
play.api.mvc.Result

好了,现在多亏了一位同事,我明白了它是什么。这种语法仅仅意味着返回一个对象,在本例中是一个类型为
Action
的对象,Action将一个函数作为构造函数参数,该函数将一个请求作为输入,并返回一个
SimpleResult
,它可以重写为,例如

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

实际上让人困惑的是,在Scala中,它们可以在括号和花括号之间进行模糊切换。因此,很难意识到它不是我所看到的函数体,而是一个动作的构造函数参数(这是一个匿名函数)

调用的方法是
def apply(=>结果)
在上。谢谢你,但它仍然没有回答我的问题…在那里采取行动的目的是什么?为什么它“有效”如果没有它?只需将其替换为
IsAuthenticated
,如何组合多个?您正在调用一个函数,该函数接受
play.api.mvc.Request
,并返回一个
play.api.mvc.Result
(正如@ggovan指出的,在这种特定情况下,这是Action companion对象的apply方法)。您可以将其替换为任何其他也接收
请求并返回
结果(或多个链接的结果)的内容,但我不会说“没有它它就可以工作”。这就像说如果
2+2=4
为什么
2-2=0
在没有添加符号的情况下“工作”。但返回类型不是
操作[AnyContent]
,它是
未来[结果]
。它不是
动作的构造函数,因为没有
动作
类,它是一种特性。
动作(…)
只是
动作的语法糖。apply
,它可以返回任何东西(在本例中,
未来[结果]
)。