Scala什么是;def函数=类型{“平均值”?
我正在使用Play2.x,在动作处理程序中发现了以下语法,例如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之外,我什么都懂,它不是函数的类型,因为函数返回
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
,它可以返回任何东西(在本例中,未来[结果]
)。