Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解scala函数的语法_Scala_Playframework 2.0 - Fatal编程技术网

理解scala函数的语法

理解scala函数的语法,scala,playframework-2.0,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") } 我的问题是这个动作在花括号之前做了什么?它叫什么?我怎样才能写我自己的?我

我正在努力学习scala。我知道如何写函数。这就是我写函数的方式

def test_function: Unit = {
    println("This is just a test")
}
但后来我开始学习playframework。这就是他们在游戏控制器中编写函数的方式

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

我的问题是这个动作在花括号之前做了什么?它叫什么?我怎样才能写我自己的?我希望我已经把问题说清楚了。提前感谢。

您可以通过在名为Action的对象上定义apply方法来获得这种行为:

然后这两个:

Action { println("hi") }
Action(println("hi"))
制作:

before
hi
after
动作后大括号中的内容只是apply方法的参数。Scala允许使用括号或大括号,但使用大括号可以将多个语句放入:

Action {
  println("a")
  println("b")
}
收益率:

before
a
b
after

通过在名为Action的对象上定义apply方法,可以获得此类行为:

然后这两个:

Action { println("hi") }
Action(println("hi"))
制作:

before
hi
after
动作后大括号中的内容只是apply方法的参数。Scala允许使用括号或大括号,但使用大括号可以将多个语句放入:

Action {
  println("a")
  println("b")
}
收益率:

before
a
b
after
Action基本上是形状play.api.mvc.Request=>play.api.mvc.Result的函数别名。当您看到动作{}时,您实际上看到了该类型的伴生对象的apply函数,并且正在传递一个应该提供Request=>Result函数的主体

def test_function: Unit = {
    println("This is just a test")
}
伴生对象的形状大致如下:

object Action {
  def apply(f: Request => Response): Action = ...
}
因此,当您调用动作{…}时,{…}就是调用该动作时将执行的函数

在您的示例中,println这只是作为结果提供者的测试。

操作基本上是形状play.api.mvc.Request=>play.api.mvc.Result的函数别名。当您看到动作{}时,您实际上看到了该类型的伴生对象的apply函数,并且正在传递一个应该提供Request=>Result函数的主体

def test_function: Unit = {
    println("This is just a test")
}
伴生对象的形状大致如下:

object Action {
  def apply(f: Request => Response): Action = ...
}
因此,当您调用动作{…}时,{…}就是调用该动作时将执行的函数

在您的示例中,println这只是作为结果提供者的测试。

操作是trait play.api.mvc.Action。本质上,它表示这种类型:play.api.mvc.Request=>play.api.mvc.Result

在您的例子中,您正在使用动作{…},这相当于动作。。。并由编译器转换为操作。应用。。。呼叫如果选中此项,您将看到不仅在Action trait及其伴生对象上定义的apply方法签名,而且在此处:

/**
 * Provides helpers for creating `Action` values.
 */
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]
在您的情况下,您并没有接受任何请求,也并没有生成任何响应,所以本质上您的操作是一个形式为applyblock:=>Result的函数调用,其中Result被丢弃,因为您将函数的返回类型定义为Unit

Action支持多种方式来处理它的主体,包括未来,所以选择正确的应用方法来满足您的需求

如果需要,您可以扩展操作,因为它不是最终实现。例如:

case class Logging[A](action: Action[A]) extends Action[A]
动作是一种特性play.api.mvc.Action。本质上,它表示这种类型:play.api.mvc.Request=>play.api.mvc.Result

在您的例子中,您正在使用动作{…},这相当于动作。。。并由编译器转换为操作。应用。。。呼叫如果选中此项,您将看到不仅在Action trait及其伴生对象上定义的apply方法签名,而且在此处:

/**
 * Provides helpers for creating `Action` values.
 */
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]
在您的情况下,您并没有接受任何请求,也并没有生成任何响应,所以本质上您的操作是一个形式为applyblock:=>Result的函数调用,其中Result被丢弃,因为您将函数的返回类型定义为Unit

Action支持多种方式来处理它的主体,包括未来,所以选择正确的应用方法来满足您的需求

如果需要,您可以扩展操作,因为它不是最终实现。例如:

case class Logging[A](action: Action[A]) extends Action[A]

谢谢你的回答,如果不是太多问题,那么你能解释一下这个行块:=>Unit@eddard.stark就是这样。谢谢你的回答,如果不是太多问题,那么你能解释一下这个行块:=>Unit@eddard.stark这就是。实际上,这不是你写函数的方式,而是你写方法的方式。实际上,这不是你写函数的方式,而是你写方法的方式。