繁体   English   中英

了解Scala函数的语法

[英]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")
}

我的问题是,在花括号之前该动作在做什么? 这叫什么? 我怎么写我自己的? 我希望我已经阐明了我的问题。 提前致谢。

您可以通过在名为Actionobject上定义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.Resultdoc1doc2 )。

在您的情况下,您正在使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM