要获得完整的答案,您应该查看我关于构建器的相当长的问题和答案(注意:截至 2012 年 9 月,Miles 的替代版本在 2.9 或最新的 2.10 中都不起作用)。
这是一个帮助您入门的框架(请注意显式和隐式参数块的奇怪格式,以避免在 SO 上显示过长的行):
import collection.generic.CanBuildFrom
case class UsefulData(data: Int) {}
def lookerUpper[C[String]](
ids: C[String], someOtherInfo: Int
)(
implicit cbf: CanBuildFrom[C[String],UsefulData,C[UsefulData]],
ev: C[String] => Iterable[String]
): C[UsefulData] = {
val b = cbf()
val i = ev(ids)
i.foreach{ s => b += UsefulData(s.length + someOtherInfo) }
b.result
}
并观察它是否有效:
scala> lookerUpper(Vector("salmon","cod"),2)
res0: scala.collection.immutable.Vector[UsefulData] =
Vector(UsefulData(8), UsefulData(5))
scala> lookerUpper(Array("salmon","cod"),2)
res1: Array[UsefulData] =
Array(UsefulData(8), UsefulData(5))
编辑:如果您只关心TraversableLike
(Array
不是)的子类,并且您将使用标准收集操作来完成所有工作,那么您可以使用Luigi 指出的 8609398 的答案。(也许我应该把这个答案作为另一个视角移到那里。)