Неявный параметр для литеральной функции
Пока читаю Play! Framework Framework, я наткнулся на этот фрагмент:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
Документация объясняетimplicit
там:
Кроме того, вы можете неявно получить Session из запроса.
Кроме того, я прочитал этот пост:Литерал с неявным и кажется логичным, что функция не может иметь неявный параметр.
Если я хорошо понял, это потому, чтофункция, вопрекиметод всегда есть контракт (интерфейс).
Действительно, например,Function1[Int, Function1[Int, Int]]
имеет в качестве первого параметра типа возвратаInt
и, таким образом, мешает нам аннотировать этот какimplicit
, Это может привести к путанице относительно типа возвращаемого значения высокого уровня:() => Int
или жеInt => Int
...
Следовательно, то, что предыдущий фрагмент кода ведет себя неявно, так как сначалаAction
Обязательный параметр является литеральной функцией.
Я предполагаю, что причиной, по которой компилятор может принять этот код, является наличие нескольких подписейAction.apply()
метод:
def apply(block: Request[AnyContent] => Result): Action[AnyContent]
def apply(block: => Result): Action[AnyContent]
(перенаправление на первый)Поскольку второй не нуждается в каком-либо параметре, выбирается ли этот в присутствии неявного параметра литеральной функции?