Неявное ключевое слово перед параметром в анонимной функции в Scala
Я понимаю неявные параметры и неявные преобразования в Scala, но я впервые увидел это сегодня: неявное ключевое слово перед параметром в анонимной функции:
Action { implicit request =>
Ok("Got request [" + request + "]")
}
Что здесь подразумевает ключевое слово?
Есть ли ресурсы в Интернете, которые больше описывают, что такое вариант использования?
Ответы
Ответ 1
Здесь есть две различные функции.
Во-первых, request
не является аргументом в вызове метода. Это аргумент анонимной функции. Сама анонимная функция является аргументом вызова метода.
Во-вторых, объявление неявного аргумента в анонимной функции имеет удобство сохранения вас от "принудительного" значения val в неявное:
Action { request =>
implicit val r = request
Ok("Got request [" + request + "]")
}
Я знаю, что это код платформы Play, но я не уверен, что такое подписи для Action и Ok. Я угадаю, что они что-то вроде этого:
def Action(r:Request => Result):Unit
case class Ok(str:msg)(implicit r:Request)
Опять же, это чистое угадывание только для иллюстративных целей.
Ответ 2
Нашел несколько ресурсов:
https://issues.scala-lang.org/browse/SI-1492
fooobar.com/questions/1389/...
найдите "Неявные аргументы в закрытии" по второй ссылке
Ответ 3
В моем понимании ключевое слово Implicit означает Пусть complier выполняет задание
Объявление неявной переменной означает, что она может использоваться для неявного параметра других методов внутри области. Другими словами, переменная рассматривается компилятором для заполнения неявных параметров.
def index = Action { implicit request =>
val str = sayHi("Jason")
Ok(views.html.index("Your new application is ready." + str))
}
private def sayHi(name: String)(implicit req: Request[AnyContent]) = name + ", you can the following content" + req.body
Объявляю неявный параметр req
в sayHi
с типом Request[AnyContent]
, однако я могу вызвать метод только с первым параметром sayHi("Jason")
, потому что неявный параметр req
заполненный компилятором для ссылки на неявную переменную request