簡體   English   中英

Scala實現內聯特征方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM