了解scala函数的语法

时间:2015-05-09 05:03:00

标签: scala playframework-2.0

我正在努力学习scala。我知道怎么写函数。这就是我编写函数的方法。

def test_function: Unit = {
    println("This is just a test")
}

然后我开始学习playframework。这就是他们如何在游戏中的控制器中编写一个函数。

def test_function: Unit = Action{
    println("This is just a test")
}

我的问题是这个动作在花括号之前做了什么?这叫什么?我怎么写自己的?我希望我的问题清楚。提前谢谢。

3 个答案:

答案 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.Resultdoc1doc2)。

在您的情况下,您使用的Action {...}等同于Action(...),并由编译器转换为Action.apply(...)调用。如果您选中source code,您会看到apply方法签名不仅定义在Action特征及其伴随对象上,而且还在此处:

/**
 * Provides helpers for creating `Action` values.
 */
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]

在您的情况下,您没有收到任何请求而且没有做出任何回复,因此基本上您的Actionapply(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

的提供者