【发布时间】:2011-04-23 04:30:54
【问题描述】:
我已经走到这一步了:
implicit def collectionExtras[A](xs: Iterable[A]) = new {
def zipWith[B, C, That](ys: Iterable[B])(f: (A, B) => C)(implicit cbf: CanBuildFrom[Iterable[A], C, That]) = {
val builder = cbf(xs.repr)
val (i, j) = (xs.iterator, ys.iterator)
while(i.hasNext && j.hasNext) {
builder += f(i.next, j.next)
}
builder.result
}
}
// collectionExtras: [A](xs: Iterable[A])java.lang.Object{def zipWith[B,C,That](ys: Iterable[B])(f: (A, B) => C)(implicit cbf: scala.collection.generic.CanBuildFrom[Iterable[A],C,That]): That}
Vector(2, 2, 2).zipWith(Vector(4, 4, 4))(_ * _)
// res3: Iterable[Int] = Vector(8, 8, 8)
现在的问题是上面的方法总是返回一个Iterable。如何使它返回传递给它的类型集合? (在这种情况下,Vector)谢谢。
【问题讨论】:
-
new { def foo = }产生一个结构类型的值,通过反射调用;为避免这种情况,请在特征 ZipWith 中声明签名,并返回此特征的实例。这适用于问题和所有解决方案。
标签: scala scala-2.8 scala-collections