Seq
は超形質であるため、より一般的であり、すべての配列に共通の特徴(線形および索引付き)を有する。
あなたは、配列のコンパニオンオブジェクトにSeq.apply
の方法によって作成されたシーケンスの種類、我々は実装を見てすることができます迷っている場合。
あなたがSeq.applyを使用する場合は、あなたがあなただけの配列が必要であることを意味し、それはリニアですか
TLのインデックスを作成した場合、あなたのコードが気にしないことにしていることに注意してください; DRの答えがありますその後:
:
あなたは違いについて
を気にしないときこれがSeq
のコンパニオンオブジェクトであるあなたは、特定の性能特性を持っている必要がある場合、あなたはより一般的なSeq
を使用LinearSeq
を使用するか
object Seq extends SeqFactory[Seq] {
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]
def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]
}
newBuilder[A]
方法は、あなたが(トレイトGenericCompanion
上で定義された)Seq.apply方法で確認することができるように、配列を構築するために使用されるものです:
def apply[A](elems: A*): CC[A] = {
if (elems.isEmpty) empty[A]
else {
val b = newBuilder[A]
b ++= elems
b.result()
}
}
さて質問です:何をしますかimmutable.Seq.newBuilder[A]
ビルド?さんはimmutable.Seq
コンパニオンオブジェクトに、この時間を見に行こう :
object Seq extends SeqFactory[Seq] {
// stuff
def newBuilder[A]: Builder[A, Seq[A]] = new mutable.ListBuffer
}
それは可変ListBuffer
を構築します!何故ですか?これは、mutable.ListBuffer
がBuilder[A, Seq[A]]
であることもあります。これは、コレクションライブラリによって新しいコレクションを構築するために使用されるクラスです。
実際の出力コレクションは、この行(あなたが上記を参照できるよう)から来ている:だから
b.result()
、ListBuffer.result()
の戻り値の型は何ですか? ListBufferで見てみましょう:
// Implementation of abstract method in Builder
def result: List[A] = toList
ここに行きます:それはリストです。
Seq(1,2,3)
は、ボンネットの下にList[Int]
を返しますが、ここで全体のポイントは、あなたは、配列を()を使用している場合は、より抽象的なことを暗示しているので、あなたが持っているコレクションの種類を知る必要がないということですインターフェイスはあなたのニーズに十分です
追加するだけで、IndexedSeq.apply(ファクトリメソッド)を使用すると、Vectorが作成されます。 Seq.applyまたはLinearSeq.applyを使用すると、リストが表示されます。多くの場合Vectorが優先されるため、疑わしいときはIndexedSeq.applyを使用する必要があります。 – pumpump