为什么包装scala.collections.immutable中的VectorBuilder?
VectorBuilder在与Vector相同的源文件中定义. Vector是不可变的并且在
scala.collections.immutable包中,因此构建器位于同一个包中.
据我所知,如果未明确键入返回类型,CanBuildFrom将使用VectorBuilder作为默认值. >是否有理由不将构建器放在可变包中的单独文件中? 解决方法
VectorBuilder不是直接使用的.如果你想获得Vector的构建器,你只需要调用Vector.newBuilder [T],它返回一个Builder [T,Vector [T]](底层实例是VectorBuilder).
因此,如果您想要用于创建Seq的默认构建器,您只需要调用Seq.newBuilder: scala> Seq(1,2,3) res0: Seq[Int] = List(1,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,从逻辑上讲,Seq的默认构建器实际上是一个mutable.ListBuffer. ListBuffer不仅仅是一个List构建器,这就是它在collection.mutable中的原因,而VectorBuilder不是Buffer,它不能用于构建Vector之外的任何其他东西.这可能是它在Vector中本地定义的原因.我不确定为什么它不是私有的,我无法在Vector本身的公共API中看到它被引用.也许它应该是(私人的). 仅供参考,CanBuildFrom没有隐藏的魔法,它几乎总是通过上面的newBuilder: >当你没有指定预期的集合类型时,如Seq(1,2).map(_ 1),唯一可用的CanBuildFrom comes from伴随对象是Seq,并且类型为CanBuildFrom [Seq [_],T,SEQ [T]].这意味着结果也将是Seq. 这就是为什么CanBuildFrom for Vector使用VectorBuilder的原因.例如,在这: scala> Vector(1,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |