Parâmetro implícito para função literal
Enquanto lê o Play! Documentação de estrutura, me deparei com este trecho:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
Documentação explicaimplicit
lá:
Como alternativa, você pode recuperar a sessão implicitamente de uma solicitação
Além disso, eu li este post:Literal com Implícito e parece logicamente que a função não pode ter um parâmetro implícito.
Se eu bem descobri, isso é porque umfunção, contrário amétodo tem sempre um contrato (interface).
De fato, por exemplo,Function1[Int, Function1[Int, Int]]
tem como primeiro parâmetro de um tipo de retorno umInt
, e assim nos impede de anotar este comoimplicit
. Isso levaria a uma confusão sobre o seu tipo de retorno de alto nível:() => Int
ouInt => Int
...
Portanto, o que o código de snippet anterior se comporta com implícito desde a primeiraAction
O parâmetro requerido é uma função literal.
Eu acho que a razão permitindo que o compilador aceite este código é as múltiplas assinaturas deAction.apply()
método:
def apply(block: Request[AnyContent] => Result): Action[AnyContent]
def apply(block: => Result): Action[AnyContent]
(redirecionando para o primeiro)Como o segundo não precisa de algum parâmetro, este é selecionado na presença do parâmetro implícito de uma função literal?