[英]Understanding syntax of a scala function
我正在尝试学习scala。 我知道如何编写函数。 这就是我编写函数的方式。
def test_function: Unit = {
println("This is just a test")
}
但是后来我开始学习游戏框架。 这就是他们如何在控制器中编写函数的方式。
def test_function: Unit = Action{
println("This is just a test")
}
我的问题是,在花括号之前该动作在做什么? 这叫什么? 我怎么写我自己的? 我希望我已经阐明了我的问题。 提前致谢。
您可以通过在名为Action
的object
上定义apply
方法来获得这种行为:
object Action {
def apply(block: => Unit): Unit = {
println("before")
block // do the action in the block
println("after")
}
}
然后这两个:
Action { println("hi") }
Action(println("hi"))
产生这个:
before
hi
after
Action
之后用大括号括起来的东西只是apply
方法的参数。 Scala允许使用括号或大括号,但是使用大括号可以将多个语句放入:
Action {
println("a")
println("b")
}
产量:
before
a
b
after
Action
是一个特征( play.api.mvc.Action
)。 本质上,它表示这种类型: play.api.mvc.Request => play.api.mvc.Result
( doc1 , doc2 )。
在您的情况下,您正在使用Action {...}
,它等效于Action(...)
,并由编译器转换为Action.apply(...)
调用。 如果您检查源代码,您将看到不仅在Action
特性及其配套对象上定义的apply
方法签名,还在以下位置中定义:
/**
* Provides helpers for creating `Action` values.
*/
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]
在您的情况下,您不会接受任何请求且不会产生任何响应,因此从本质上讲,您的Action
是形式为apply(block: => Result)
的函数调用,由于您将函数的返回类型定义为Unit
,因此Result
被丢弃。
Action
支持您处理其主体(包括期货)的多种方式,因此请选择正确的apply
方法来满足您的需求。
您可以根据需要扩展Action
,因为它不是最终的实现。 这是一个例子:
case class Logging[A](action: Action[A]) extends Action[A]
Action
基本上是形状play.api.mvc.Request => play.api.mvc.Result
的函数别名。 当您看到Action { }
,实际上是在看到该类型的伴随对象的apply
函数,并且正在传递应提供Request => Result
函数的主体。
伴随对象的形状大致为:
object Action {
def apply(f: Request => Response): Action = ...
}
因此,当您调用Action { ... }
, { ... }
是将在调用该动作时执行的函数。
在您的示例中, println("This is just a test")
作为Result
的提供者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.