理解scala函数的语法
我正在努力学习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") } 我的问题是这个动作在花括号之前做了什么?它叫什么?我怎样才能写我自己的?我
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这就是。实际上,这不是你写函数的方式,而是你写方法的方式。实际上,这不是你写函数的方式,而是你写方法的方式。