我有一个树对象,它将延迟深度优先搜索实现为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
执行更多操作?
答案 0 :(得分:2)
视图用户希望能够调用force
来获得严格的收集。通过实现,在树上调用force
(或树的任何变换 - 例如,tree.take(10).filter(pred)
等)将导致空指针异常。
这对您来说没什么用 - 例如,您仍然可以使用toList
强制进行评估(尽管如果您走这条路线,您应该遵循DaoWen评论中的建议。)
underlying
的实际内容应该永远不会被使用,所以有一个简单的修复 - 只需使它成为一个适当类型的空集合:
protected def underlying = Vector.empty[T]
现在,如果用户拨打tree.force
,他们会获得一个标签矢量,静态输入为Traversable[T]
。