3

我有以下类定义:

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

而且我想Foo拥有所有Iterator公开的方法,同时仍然返回 type 的对象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 })

我查看了转发器 ( IterableForwarder, TraversableForwarder, ...),但似乎没有一个适合将方法转发到Iterator,并且我仍然希望将其保留Foo为静态和动态结果类型。

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

4

1 回答 1

1

我需要 Foo 类,而不仅仅是作为一个迭代器,因为我需要能够通过它的值进行多次传递。

然后你想要一个Traverable或一个Iterable。要让它们按您的意愿工作,您需要扩展它们和TraversableLikeor IterableLike,您将通过它指定返回类型。您还需要同时提供 aBuilder和 a CanBuildFrom

这是一个简单的实现:

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)
    }
  }
}
于 2012-09-04T01:01:05.270 回答