VectorBuilder直接使用するためのものではありません。のビルダーを取得したい場合はVector、 を呼び出すだけでよくVector.newBuilder[T]、これは を返しますBuilder[T, Vector[T]](基礎となるインスタンスはVectorBuilderです)。
したがって、を作成するために使用されるデフォルトのビルダーが必要な場合は、次のSeqように呼び出すだけですSeq.newBuilder。
scala> Seq(1,2,3)
res0: Seq[Int] = List(1, 2, 3)
scala> Seq.newBuilder[Int]
res1: scala.collection.mutable.Builder[Int,Seq[Int]] = ListBuffer()
scala> Seq.newBuilder[Int].result
res2: Seq[Int] = List()
上記は、 のデフォルトの実装Seqが list であることを示しており、論理的には、 a のデフォルトのビルダーSeqは実際には amutable.ListBufferです。
ListBufferは単なるListビルダーではcollection.mutableありVectorBuilderません。Bufferそのため、ビルド a 以外には使用できませんVector。でローカルに定義されているのはおそらくそのためですVector。なぜそうでないのかわかりません。それ自体privateのパブリック API のどこにも参照されていません。Vector多分それは(プライベート)であるべきです。
参考までに、 で起こっている隠された魔法はありません。ほとんどの場合、上記CanBuildFromを通過するだけです。newBuilder
のように、予期されるコレクション タイプを指定しない場合、使用できるのは、コンパニオン オブジェクト aからSeq(1,2).map(_+1)のものだけであり、タイプはです。つまり、結果も a になります。CanBuildFrom SeqCanBuildFrom[Seq[_], T, Seq[T]]Seq
コレクションのほとんどのコンパニオン オブジェクトと同様に、CanBuildFromインスタンスSeqが提供する機能は 1 つだけです: call ( GenTraversableFactorySeq.newBuilderで定義されています ...)
そのためCanBuildFrom、 forは をVector使用しVectorBuilderます。たとえば、次のようになります。
scala> Vector(1,2,3).map(_+1)
res12: scala.collection.immutable.Vector[Int] = Vector(2, 3, 4)
使用したビルダーは次のとおりです。
scala> implicitly[CanBuildFrom[Vector[Int], Int, Vector[Int]]].apply()
res13: scala.collection.mutable.Builder[Int,Vector[Int]] =
scala.collection.immutable.VectorBuilder@43efdf93