While reading Play! Framework documentation, I came across this snippet:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
Documentation explains implicit
there:
Alternatively you can retrieve the Session implicitly from a request
Besides, I read this post: Literal with Implicit and it seems logically that function cannot have implicit parameter.
If I well figured out, this is because a function, contrary to method has always a contract (interface).
Indeed, for instance, Function1[Int, Function1[Int, Int]]
has as a return type's first parameter an Int
, and thus prevents us to annotate this one as implicit
. This would lead to a confusion about its high-level return type: () => Int
or Int => Int
...
Therefore, what the previous snippet code behaves with implicit since first Action
's required parameter is a literal function.
I guess the reason allowing compiler to accept this code is the multiple signatures of Action.apply()
method:
def apply(block: Request[AnyContent] => Result): Action[AnyContent]
def apply(block: => Result): Action[AnyContent]
(redirecting to the first one)
Since the second doesn't need some parameter, is this one selected in presence of a literal function's implicit parameter?