从scala集合中检索构建器

时间:2013-03-20 05:47:16

标签: scala collections scala-collections

如何从scala集合中检索构建器,使其无法实现?我已经将参数类型限制为TraversableLike的后代,但它的newBuilder方法受到保护,我无法从外部调用它。

2 个答案:

答案 0 :(得分:4)

通过隐式CanBuildFrom的使用来检索构建器,它基于以下参数自动解析:

  • 输入集合中的元素类型
  • 输入集合的类型
  • 合适类型的输出集合。

例如,如果您在返回_.toString的List [Int]上执行地图,则CanBuildFrom将显示以下内容:

CanBuildFrom[List,Int,List[String]]

您应该依赖相同的机制来动态检索所需的正确构建器。

答案 1 :(得分:3)

代码段有助于提供一些背景信息。你提到“论证类型”......

无论是什么声明这个论点,它都有Repr的类型参数吗?喜欢

def mysteryMethod[A, Repr](arg: TraversableLike[A, Repr]): Builder[A, Repr]

假设你可以这样做:

import collection.TraversableLike
import collection.mutable.Builder
import collection.generic.CanBuildFrom

def mysteryMethod[A, Repr](arg: TraversableLike[A, Repr])(implicit 
                 cbf: CanBuildFrom[Repr, A, Repr]): Builder[A, Repr] = cbf.apply 

val t: TraversableLike[Int, Vector[Int]] = Vector(1, 2)
val builder = mysteryMethod(t)                  
builder += 3                                    
builder += 4                                 
builder.result                      //> res2: Vector[Int] = Vector(3, 4)