簡體   English   中英

文字函數的隱式參數

[英]Implicit parameter for literal function

在閱讀游戲! 框架文檔,我遇到了以下片段:

def index = Action { implicit request =>
  session.get("connected").map { user =>
    Ok("Hello " + user)
  }.getOrElse {
    Unauthorized("Oops, you are not connected")
  }
}

文檔在那里implicit解釋:

或者,您可以從請求中隱式檢索會話

此外,我閱讀了這篇文章: 具有隱式的文字,從邏輯上看,函數不能具有隱式參數。

如果我很好地弄清楚,這是因為與方法相反的function始終具有協定(接口)。

事實上,例如, Function1[Int, Function1[Int, Int]]已作為返回類型的第一個參數的Int ,從而防止我們詮釋這一個為implicit 這將導致對其高級返回類型的混淆: () => IntInt => Int ...

因此,由於first Action的required參數是文字函數,因此之前的代碼段具有隱式行為。

我猜想允許編譯器接受此代碼的原因是Action.apply()方法的多個簽名:

  • def apply(block: Request[AnyContent] => Result): Action[AnyContent]
  • def apply(block: => Result): Action[AnyContent] (重定向到第一個)

由於第二個不需要某些參數,是否在存在文字函數的隱式參數的情況下選擇了該參數?

考慮以下代碼:

class MyImplicitClass(val session: Int)
object Tester {
  def apply(fun: MyImplicitClass => Int): Int = ???
  def apply(fun: => Int): Int = ???
}
Tester { implicit myImplicitClass => session * 20}

如果此功能:

def session(implicit myImplicitClass: MyImplicitClass): Int = myImplicitClass.session

在范圍內,則第一個代碼段將編譯,因為很明顯隱式參數myImplicitClass將傳遞給函數 session ,以訪問字段 myImplicitClass.session ,從而允許您省略對字段的訪問。 這正是玩法的竅門! 框架正在使用,請檢查Controller以找到session功能。

附帶說明一下,上述閉包並未說明它采用了隱式參數,這是一種語言功能,可避免必須執行以下操作:

Tester { myImplicitClass => 
  implicit val x = myImplicitClass
  session * 20
}

當要使用閉包參數作為閉包主體中的隱式值時。 另請注意,從Scala 2.9開始,此技巧僅限於帶有正好1個參數的閉包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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