Palabra clave implícita antes de un parámetro en función anónima en Scala


Entiendo los parámetros implícitos y las conversiones implícitas en Scala, pero vi esto por primera vez hoy: la palabra clave implícita frente a un parámetro en una función anónima:

Action { implicit request =>
  Ok("Got request [" + request + "]")
}

¿Qué hace aquí la palabra clave implícita?

¿Hay recursos en la web que describan más sobre cuál es el caso de uso?

Author: platypus, 2012-10-02

3 answers

Hay dos características distintas aquí.

Primero, request no es realmente un argumento en una invocación de método. Es el argumento de una función anónima. La función anónima en sí es el argumento de la invocación del método.

En segundo lugar, declarar un argumento implícito en una función anónima tiene la conveniencia de salvarlo de "forzar" un val a un implícito:

Action { request =>
  implicit val r = request
  Ok("Got request [" + request + "]")
}

Resulta que sé que este es un código de marco de juego, pero no estoy seguro de cuáles son las firmas para la Acción y bien. Supongo que son algo así:

def Action(r:Request => Result):Unit
case class Ok(str:msg)(implicit r:Request)

De nuevo, es pura conjetura solo con fines ilustrativos.

 22
Author: pedrofurla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-02 07:28:44

Encontré algunos recursos:

Https://issues.scala-lang.org/browse/SI-1492

Https://stackoverflow.com/a/5015161/480674

Busque "Argumentos implícitos en cierres" en el segundo enlace

 6
Author: platypus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:22

A mi entender, la palabra clave de Implícito significa Dejar que complier haga el trabajo

Declarar una variable implícita significa que puede ser utilizada para parámetros implícitos de otros métodos dentro del ámbito. En otras palabras, la variable está siendo considerada por el compilador para rellenar parámetros implícitos.

 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

Declaro un parámetro implícito req en sayHi con type Request[AnyContent], sin embargo, puedo llamar al método con solo el primer parámetro sayHi("Jason") porque el parámetro implícito req es rellenado por el compilador para hacer referencia a la variable implícita request

 4
Author: code4j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-29 07:27:43