[英]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
。 這將導致對其高級返回類型的混淆: () => Int
或Int => 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.