我正在努力学习scala。我知道怎么写函数。这就是我编写函数的方法。
def test_function: Unit = {
println("This is just a test")
}
然后我开始学习playframework。这就是他们如何在游戏中的控制器中编写一个函数。
def test_function: Unit = Action{
println("This is just a test")
}
我的问题是这个动作在花括号之前做了什么?这叫什么?我怎么写自己的?我希望我的问题清楚。提前谢谢。
答案 0 :(得分:2)
您可以通过在名为apply
的{{1}}上定义object
方法来获得此类行为:
Action
然后这两个:
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
方法的参数。 Scala允许使用括号或大括号,但使用大括号可以将多个语句放在:
apply
的产率:
Action {
println("a")
println("b")
}
答案 1 :(得分:2)
Action
是一个特征(play.api.mvc.Action
)。基本上它代表了这种类型:play.api.mvc.Request => play.api.mvc.Result
(doc1,doc2)。
在您的情况下,您使用的Action {...}
等同于Action(...)
,并由编译器转换为Action.apply(...)
调用。如果您选中source code,您会看到apply
方法签名不仅定义在Action
特征及其伴随对象上,而且还在此处:
/**
* Provides helpers for creating `Action` values.
*/
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]
在您的情况下,您没有收到任何请求而且没有做出任何回复,因此基本上您的Action
是apply(block: => Result)
形式的函数调用,其中Result
被抛弃,因为您定义将函数的类型返回为Unit
。
Action
支持您处理其正文的许多方式(包括期货),因此请选择正确的apply
方法来满足您的需求。
如果需要,您可以扩展Action
,因为它不是最终实现。 Here就是一个例子:
case class Logging[A](action: Action[A]) extends Action[A]
答案 2 :(得分:1)
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
。