Niejawny parametr dla funkcji literalnej
Podczas czytania Graj! Dokumentacja ramowa, natknąłem się na ten fragment:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
Dokumentacja wyjaśniaimplicit
tam:
Alternatywnie możesz pobrać sesję niejawnie z żądania
Poza tym przeczytałem ten post:Dosłowne z niejawnym i wydaje się logiczne, że funkcja nie może mieć domyślnego parametru.
Jeśli dobrze zrozumiałem, to dlatego, że afunkcjonować, przeciwnie dometoda ma zawsze umowę (interfejs).
Rzeczywiście, na przykładFunction1[Int, Function1[Int, Int]]
ma jako pierwszy parametr typu zwracanego anInt
i tym samym uniemożliwia nam przypisywanie tego jakoimplicit
. Doprowadziłoby to do zamieszania w związku z typem powrotu wysokiego poziomu:() => Int
lubInt => Int
...
W związku z tym, co poprzedni kod urywkowy zachowuje się z ukrytym od początkuAction
wymagany parametr jest funkcją dosłowną.
Myślę, że powodem, dla którego kompilator może zaakceptować ten kod, jest wiele podpisówAction.apply()
metoda:
def apply(block: Request[AnyContent] => Result): Action[AnyContent]
def apply(block: => Result): Action[AnyContent]
(przekierowanie do pierwszego)Ponieważ drugi nie potrzebuje jakiegoś parametru, czy ten wybrany jest w obecności ukrytego parametru funkcji literalnej?