4

トラバース可能を一度トラバース可能に、どちらも解決せずに一度トラバース可能に連結したいと思います。これは私が暗黙的に思いついた解決策ですが、ネイティブの解決策が欠けているかどうかはわかりません...

object ImplicitTraversableOnce {
  implicit def extendTraversableOnce[T](t : TraversableOnce[T]) = new TraversableOnceExtension(t)
}

class TraversableOnceExtension[T <: Any](t : TraversableOnce[T]) {

  def ++ (t2:TraversableOnce[T]):TraversableOnce[T] = new concat(t.toIterator, t2.toIterator)

  private class concat(i1:Iterator[T], i2:Iterator[T]) extends Iterator[T] {
    private var isOnSecond = false

    def hasNext:Boolean =
      if (isOnSecond) i2.hasNext
      else if (!i1.hasNext) {
        isOnSecond = true
        hasNext
      }
    else true

    def next():T = if (isOnSecond) i2.next() else i1.next()
  }
}
4

2 に答える 2

7

++でイテレータに参加できます。したがって、とにかくイテレータを使用する場合は、

def ++(t2: TraversableOnce[T]): TraversableOnce[T] = t.toIterator ++ t2.toIterator

これを行わない理由は、/ではないsに効率foreach的なものを提供するためですが、すべての抽象メソッドを入力する必要があります。TraversableIterableIteratorTraversableOnce

于 2012-10-25T16:18:27.173 に答える
4

どうですか:

  def ++(t2: TraversableOnce[T]) = new Traversable[T] {
    def foreach[U](f: (T) => U) {
      t.foreach(f)
      t2.foreach(f)
    }
  }
于 2012-10-26T00:55:01.720 に答える