3

私は次のクラス定義を持っています:

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

そして、タイプのオブジェクトを返しながら、公開するFooすべてのメソッドが必要です。たとえば、私は次のことができるようにしたいと思います。IteratorFoo

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保持したいと思います。Foo

すべての転送方法を定義せずに、この動作を実現するための最良の方法は何ですか?

4

1 に答える 1

1

Fooクラスはそのままで、イテレータとしてだけでなく、その値を複数回通過できる必要があるため、必要です。

次に、Traverableまたはのいずれかが必要ですIterable。それらを希望どおりに機能させるには、とまたはの両方を拡張する必要がありTraversableLikeますIterableLike。これを使用して、リターンタイプを指定します。Builderまた、aと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 に答える