2

Scala 2.8.2にはSeq.applyメソッドがあるため、REPLで次のように記述できます。

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

これはScala2.9.2でも機能しますが、私が困惑しているのは、ドキュメントによると、scala.collection.Seq.applyメソッドのようなものはもうないということです。

私はscala-Xprint:typerでチェックしました、そしてこれはそれが印刷するものです:

[[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)

したがって、結果は事実上次のようになります。

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

これは、まだSeq.applyを呼び出していることを示していますが、このメソッドはどこにありますか?

4

1 に答える 1

4

これは本当にScaladoc2.9.2のバグです。

scala-library.jarを調べたところ、コンパニオンオブジェクトscala.collection.Seqが間接的にscala.collection.generic.GenericCompanion [Seq]を拡張し、メソッドシグネチャを効果的に提供していることがわかりました。

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

これにより、newBuilderが呼び出され、Seqでオーバーライドされて次の値が返されます。

scala.collection.immutable.Seq.newBuilder[A]
于 2012-07-26T12:13:13.010 に答える