2012-10-25 62 views
2

我想將可遍歷一次連接到可遍歷一次而不解析。 這是解決方案,我想出了爲含蓄,但我不知道是否我缺少一個本地的解決方案...在Scala中連接TraversableOnce對象?

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() 
    } 
} 
+0

Maaaybe你會發現它有用:番石榴有一組CONCAT的'()''中和Iterators'方法['Iterables'(HTTP://docs.guava -libraries.googlecode.com/git/javadoc/com/google/common/collect/Iterables.html)。我知道這是Java,但作爲最後的手段,你可以轉換Scala - > Java - > Scala –

回答

6

您可以加入與迭代器++。所以,如果你要使用迭代無論如何,只是

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

之所以這樣做是爲了提供一個有效的foreachTraversable S中的不Iterable/Iterator,但你需要填寫所有TraversableOnce抽象方法。

+0

你是對的,我不知道我是如何錯過這一個,scala實現幾乎一樣 –

2

如何:

def ++(t2: TraversableOnce[T]) = new Traversable[T] { 
    def foreach[U](f: (T) => U) { 
     t.foreach(f) 
     t2.foreach(f) 
    } 
    }