[英]Scala implement inline trait method
我已經開始學習scala和play框架。 我從播放框架網站下載了示例項目。 我有一個新手問題,因為我無法理解以下語法:
def count = Action { Ok(counter.nextCount().toString) }
它到底是做什么的? Action
是在BaseController中實現的功能,在其中分配了動作生成器。 beetwen大括號的內容是什么? 大括號在這種情況下是什么意思?
在播放框架中,請求由Actions
處理。 調用Action { ... }
,實際上是在調用play.api.mvc.Action
幫助器對象來創建Action
值。
object Action extends ActionBuilder[Request] { ... }
如果仔細觀察Action
對象,它會擴展到play.api.mvc.ActionBuilder
特性。 此特征包含各種overloaded
apply
方法,這些方法創建Action
值。 因此,當您調用Action{ ... }
時,實際上是在調用Action.apply({...})
並且此apply
方法是從ActionBuilder
特性繼承的。 如果查看ActionBuilder
特性,您將看到各種較高順序的apply
函數。
現在就您而言, def count = Action { Ok(counter.nextCount().toString) }
您實際上是在調用帶有默認內容且沒有請求參數的apply
方法。
final def apply(block: => Result): Action[AnyContent] = apply(_ => block)
這意味着,您將提供塊{ Ok(counter.nextCount().toString) }
,該塊返回Ok
結果。
beetwen大括號的內容是什么? 大括號在這種情況下是什么意思?
當您執行Action { Ok(counter.nextCount().toString) }
,實際上是在調用:
Action.apply(Ok(counter.nextCount().toString))
在scala中, apply
方法是一種工廠方法,因此您不必本質上調用apply方法,因此也可以執行Action(Ok(counter.nextCount().toString))
。 此外,如果您的函數僅使用單個參數,則可以將大括號{}
替換為()
。 即,您可以執行Action{Ok(counter.nextCount().toString)}
。
我建議研究一下函數文字,更高階的函數,by-name參數,方法循環等。因此,您將對這些有更多的了解。
源代碼將為您提供詳細信息:
/**
* Constructs an `Action` with default content, and no request parameter.
*
* For example:
* {{{
* val hello = Action {
* Ok("Hello!")
* }
* }}}
*
* @param block the action code
* @return an action
*/
final def apply(block: => Result): Action[AnyContent] =
apply(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(_ => block)
等效於def count = Action.apply(Ok(counter.nextCount().toString))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.