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)等)将导致空指针异常。

这对你来说可能没问题 - 例如,你仍然可以使用 强制评估toList(尽管如果你走那条路,你应该遵循 DaoWen 评论中的建议)。

underlying但是,不应该使用的实际内容,所以有一个简单的解决方法——只需将其设置为适当类型的空集合:

protected def underlying = Vector.empty[T]

现在,如果用户调用tree.force,他们将得到一个标签向量,静态类型为Traversable[T].

于 2012-12-03T10:28:54.593 回答