我可以将自定义Scala TraversableView的底层成员保留为null吗?

时间:2012-12-02 21:21:55

标签: scala scala-collections

我有一个树对象,它将延迟深度优先搜索实现为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执行更多操作?

1 个答案:

答案 0 :(得分:2)

视图用户希望能够调用force来获得严格的收集。通过实现,在树上调用force(或树的任何变换 - 例如,tree.take(10).filter(pred)等)将导致空指针异常。

这对您来说没什么用 - 例如,您仍然可以使用toList强制进行评估(尽管如果您走这条路线,您应该遵循DaoWen评论中的建议。)

underlying的实际内容应该永远不会被使用,所以有一个简单的修复 - 只需使它成为一个适当类型的空集合:

protected def underlying = Vector.empty[T]

现在,如果用户拨打tree.force,他们会获得一个标签矢量,静态输入为Traversable[T]