簡體   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