在Scala中转发对底层对象的调用

时间:2012-09-03 19:02:39

标签: scala scala-2.8 scala-collections

我有以下类定义:

class Foo[T](iteratorThunk: () => Iterator[T]) {
  def values = iteratorThunk()
}

我希望Foo拥有Iterator公开的所有方法,同时仍然返回Foo类型的对象。例如,我希望能够做到:

val a = new Foo({ () => List(1, 2, 3).toIterator })
val b = new Foo({ () => List(4, 5, 6).toIterator })
val c = a ++ b

c等于:

new Foo({ () => a.values ++ b.values })

我查看了转发器(IterableForwarderTraversableForwarder,...),但似乎没有一个方法可以将方法转发给Iterator,我仍然想保留{ {1}}作为静态和动态结果类型。

在没有定义每种转发方法的情况下,实现此行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我需要Foo类,而不仅仅是Iterator,因为我   需要能够通过其值进行多次传递。

然后您需要TraverableIterable。要让它们按照您的意愿工作,您需要扩展它们TraversableLikeIterableLike,您将通过它们指定返回类型。而且您还需要同时提供BuilderCanBuildFrom

这是一个简单的实现:

import scala.collection.IterableLike
import scala.collection.mutable.LazyBuilder
class Foo[T](iteratorThunk: () => Iterator[T]) extends Iterable[T] with IterableLike[T, Foo[T]] {
  def iterator = iteratorThunk()
  override protected def newBuilder = new Foo.FooBuilder[T]
}

object Foo {
  class FooBuilder[T] extends LazyBuilder[T, Foo[T]] {
    def result(): Foo[T] = {
      val coll = parts.toList.flatten
      new Foo(() => coll.iterator)
    }
  }
}
相关问题