[英]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")
}
我的問題是,在花括號之前該動作在做什么? 這叫什么? 我怎么寫我自己的? 我希望我已經闡明了我的問題。 提前致謝。
您可以通過在名為Action
的object
上定義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.Result
( doc1 , doc2 )。
在您的情況下,您正在使用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.