El compilador se encarga de buscar un valor adecuado en el ámbito para completar la llamada.
Veamos un ejemplo simple:
def saludar(nombre: String)(implicit saludo: String): Unit =
println(s"$saludo, $nombre!")
implicit val saludoPorDefecto: String = "Hola"
saludar("Emanuel") // Usa el valor implícito definido arriba
Cuando Scala ve que falta un argumento para un parámetro implicit, sigue este proceso:
- Busca en el ámbito local: valores o funciones marcados como implicit del tipo requerido.
- Si no encuentra ninguno, busca en el objeto compañero (companion object) del tipo esperado.
- Si encuentra más de uno y no puede decidir cuál usar, el compilador lanza un error por ambigüedad.
- Si no encuentra ninguno, lanza un error por parámetro implícito no encontrado.
Veamos un ejemplo de ambigüedad:
implicit val saludo1: String = "Hola"
implicit val saludo2: String = "Buenas"
saludar("Emanuel") // Error: ambiguous implicits
El compilador no puede elegir entre `saludo1` y `saludo2`.
Scala resuelve los parámetros implícitos buscando un valor del tipo adecuado en:
El ámbito local,
Los imports activos,
Y los companion objects relacionados.
Es un mecanismo potente que permite propagar contextos automáticamente (por ejemplo, ExecutionContext, Ordering, Numeric, etc.), reduciendo la necesidad de pasar dependencias manualmente.
