/ / Où est passé Seq.apply dans Scala 2.9.2? - scala

Où est passé Seq.apply dans Scala 2.9.2? - scala

Scala 2.8.2 a une méthode Seq.apply, de sorte que vous pouvez écrire ce qui suit dans le REPL:

val l = Seq(1, 2)
l: Seq[In] = List(1, 2)

Cela fonctionne toujours dans Scala 2.9.2, mais ce qui me surprend, c’est que, d’après la documentation, il n’existe plus de méthode scala.collection.Seq.apply.

J'ai vérifié avec scala -Xprint: typer et voici ce qu'il affiche:

[[syntax trees at end of typer]]// Scala source: <console>
package $line14 {
final object $read extends java.lang.Object with ScalaObject {
def this(): object $line14.$read = {
$read.super.this();
()
};
final object $iw extends java.lang.Object with ScalaObject {
def this(): object $line14.$read.$iw = {
$iw.super.this();
()
};
final object $iw extends java.lang.Object with ScalaObject {
def this(): object $line14.$read.$iw.$iw = {
$iw.super.this();
()
};
private[this] val l: Seq[Int] = collection.this.Seq.apply[Int](1, 2);
<stable> <accessor> def l: Seq[Int] = $iw.this.l
}
}
}
}

[[syntax trees at end of typer]]// Scala source: <console>
package $line14 {
final object $eval extends java.lang.Object with ScalaObject {
def this(): object $line14.$eval = {
$eval.super.this();
()
};
lazy private[this] var $result: Seq[Int] = {
$eval.this.$print;
$line14.$read.$iw.$iw.l
};
private[this] val $print: String = {
$read.$iw.$iw;
"l: Seq[Int] = ".+(scala.runtime.ScalaRunTime.replStringOf($line14.$read.$iw.$iw.l, 1000))
};
<stable> <accessor> def $print: String = $eval.this.$print
}
}

l: Seq[Int] = List(1, 2)

Donc, le résultat est effectivement:

collection.this.Seq.apply[Int](1, 2)

ce qui indique qu'il appelle toujours Seq.apply, mais où est cette méthode?

Réponses:

4 pour la réponse № 1

C’est vraiment un bogue dans Scaladoc 2.9.2.

J'ai inspecté la bibliothèque de scala.jar et constaté que l'objet compagnon scala.collection.Seq étend indirectement scala.collection.generic.GenericCompanion [Seq], ce qui fournit efficacement la signature de la méthode:

def apply[A](elems: A*): Seq[A]

Ceci appelle à son tour newBuilder, qui est remplacé dans Seq pour renvoyer:

scala.collection.immutable.Seq.newBuilder[A]