Ampliando la respuesta de Kevin y explicar por qué no es posible para scaladoc de decirle lo que existe la conversión implícita: las conversiones implícitas sólo entran en juego cuando el código no lo haría compila lo contrario.
Puede verlo como un mecanismo de recuperación de error para errores de tipo que se activa durante la compilación. En este caso, Array[String]
no tiene un método mkString
. Este código no se compilaría porque ese método no existe en Array[T]
. Pero antes de renunciar, el compilador buscará una conversión implícita en el alcance.
Ocurre que Predef
trae un número de conversiones implícitas en el alcance y una que se aplicará aquí.
Averiguar qué conversión implícita se aplica se puede hacer mediante la compilación con el -Xprint:typer
marca. En este caso, sería imprimir:
$ scalac -d classes -Xprint:typer A.scala
[[syntax trees at end of typer]]// Scala source: A.scala
package <empty> {
final object myApp extends java.lang.Object with App with ScalaObject {
def this(): object myApp = {
myApp.super.this();
()
};
scala.this.Predef.println("Echo ".+(scala.this.Predef.refArrayOps[String](myApp.this.args).mkString(" ")))
}
}
Así se puede ver que Predef.refArrayOps
es, de hecho, la conversión implícita utiliza. Convierte tu matriz en ArrayOps[String]
que tiene un mkString
method.
Así que con eso en mente, usted puede ver por qué scaladoc para Array
no puede decir lo que se podría aplicar la conversión implícita. Podría ser cualquier cosa. De hecho, se basa completamente en el hecho de que no existe tal método. Solo el compilador sabrá qué implícito encontró en función del código.
Incluso puede definir su propia conversión implícita:
object myApp extends App {
implicit def myImplicit(arr:Array[String]) = new {
def mkString(s:String) = arr.length + s
}
println("Echo " + (args mkString(" ")))
}
que tendría el siguiente efecto:
$ scala -cp classes myApp a b c
Echo 3
Obviamente scaladoc no será capaz de demostrar que. Tenga en cuenta que el complemento Eclipse Scala puede llevarlo a la implementación de mkString
presionando F3 (terminará en TraversableOnce
).
Gracias, no tuve cabeza de conversiones implícitas. WrappedArray y Vector obtienen el método mkString del rasgo TraversableOnce que comparten. ¿Podría ser útil si Scaladoc te dijera en una definición de clase qué definiciones implícitas existían? –