gpt4 book ai didi

scala - 在使用 Play 框架的 Scala 函数定义中,单词 "Action"有什么作用?

转载 作者:行者123 更新时间:2023-12-04 00:07:29 24 4
gpt4 key购买 nike

我正在开发 Play 应用程序,我刚刚开始使用 Scala。我看到有这个词Action在下面函数中的等号之后和花括号之前。

def index = Action {
Ok(views.html.index("Hi there"))
}

这段代码有什么作用?我见过它与 def index = { 一起使用但不是花括号前的单词。

我假设函数的名称是 index .但是不知道是什么字 Action在这种情况下。

最佳答案

这个词是 Play Framework 的一部分,它是一个 object , 有方法 apply(block: ⇒ Result) ,所以你的代码实际上是:

def index: Action[AnyContent] = Action.apply({
Ok.apply(views.html.index("Hi there"))
})

您的 index方法返回 class 的一个实例 Action[AnyContent] .

顺便说一句,您正在传递一段代码 {Ok(...)}apply方法,它(代码块)实际上在这里充当匿名函数,因为 apply 所需的类型的输入不仅仅是 Result但是 ⇒ Result ,这意味着它接受一个没有输入参数的匿名函数,返回 Result .因此,当容器收到您的 Action 类实例时,您的 Ok block 将被执行(来自 index 方法),决定执行这个 block 。这仅仅意味着您只是在这里描述一个 Action - 不执行 - 它会在 Play 收到您的请求时实际执行 - 并在路由文件中找到与您的 Action 的绑定(bind)。

此外,您不必使用 def在这里,您总是返回相同的操作 - vallazy val通常就足够了。您将需要一个 def仅当您确实想从路由表中传递一些参数时(例如):
GET   /clients/:id          controllers.SomeController.index(id: Long)

def index(id: Long) = Action { ... } // new action generated for every new request here

另一种可能的方法是根据参数选择操作:
def index(id: Long) = {
if (id == 0) Action {...} else Action{...}
}

但通常你可以使用路由表本身,这对解耦更好。此示例仅显示 Action无非是返回值。

@Kazuya 的更新
 val method1 = Action{...} //could be def too, no big difference here

// this (code inside Action) gonna be called separately after "index" (if method2 is requested of course)
// notice that it needs the whole request, so it (request) should be completely parsed at the time
val method2 = Action{ req => // you can extract additional params from request
val param1 = req.headers("header1")
...
}

//This is gonna be called first, notice that Play doesn't need the whole request body here, so it might not even be parsed on this stage
def index(methodName: String) = methodName match {
case "method1" => method1
case "method2" => method2
}

GWT/Scala.js 使用类似的方法进行客户端-服务器交互。这只是解释从路由表传递的参数“methodName”的重要性的一种可能的解决方案。因此, Action 可以被认为是对函数的包装,它反过来代表对 OOP 方法的引用,这使得它对 REST 和 RPC 目的都有用。

关于scala - 在使用 Play 框架的 Scala 函数定义中,单词 "Action"有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com