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
Seq
CanBuildFrom[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