2012-12-02 68 views
3

我有一個樹對象,實現惰性深度優先搜索作爲TraversableView我可以離開我的自定義Scala 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

即使這是正確的,我絕不會推薦使用'null'這樣的。相反,嘗試拋出一個描述性的異常,以便如果'底層'永遠不會被調用,你就會知道何時何地,而不是在'null'值傳播到其他地方之後得到一個令人困惑的空指針異常。 – DaoWen

回答

2

用戶的意見將期望能夠撥打force獲得嚴格的收集。通過實現,在樹上調用force(或任何樹的轉換 - 例如tree.take(10).filter(pred)等)將導致空指針異常。

這可能對您很好 - 例如您仍然可以使用toList強制進行評估(儘管您應該遵循道文評論中的建議,如果您走這條路線)。

underlying實際內容不應該習慣,雖然如此,有一個簡單的辦法,只是使它適當類型的空集:

protected def underlying = Vector.empty[T] 

現在,如果用戶呼叫tree.force,他們會得到一個標籤矢量,靜態鍵入爲Traversable[T]

相關問題