3

レイジーな深さ優先検索を として実装するツリー オブジェクトがありますTraversableView

import collection.TraversableView

case class Node[T](label: T, ns: Node[T]*)

case class Tree[T](root: Node[T]) extends TraversableView[T, Traversable[_]] {
    protected def underlying = null

    def foreach[U](f: (T) => U) {
        def dfs(r: Node[T]): TraversableView[T, Traversable[_]] = {
            Traversable(r.label).view ++ r.ns.flatMap(dfs(_))
        }
        dfs(root).foreach(f)
    }
}

これは魅力的なほど簡潔で、機能しているように見えます。しかし、そのunderlying = null方法は意味がわからないので緊張します。(IntelliJ は私のためにその行を書きました。)この場合、ツリーの根底にある厳密な表現がないため、正しいかもしれませんが、よくわかりません。

上記のコードは正しいですか、それとももっと何かをする必要がありunderlyingますか?

4

1 に答える 1

2

forceビューのユーザーは、厳密なコレクションを取得するために呼び出すことができることを期待します。実装でforceは、ツリー (またはツリーの任意の変換 —tree.take(10).filter(pred)など) を呼び出すと、null ポインター例外が発生します。

これで問題ないかもしれません。たとえば、を使用して評価を強制することもできtoListます (ただし、そのルートに進む場合は、DaoWen のコメントのアドバイスに従う必要があります)。

ただし、の実際の内容はunderlying決して使用されるべきではないため、簡単な修正があります。適切に型指定された空のコレクションにするだけです。

protected def underlying = Vector.empty[T]

ユーザーが を呼び出すとtree.force、 として静的に型指定されたラベルのベクトルが取得されますTraversable[T]

于 2012-12-03T10:28:54.593 に答える