考慮以下幾點:由不可變類型構成的結構有可能有一個循環嗎?
case class Node(var left: Option[Node], var right: Option[Node])
可以很容易地看到你怎麼可以遍歷此,搜索它,不管。但現在想象你做到了這一點:
val root = Node(None, None)
root.left = root
現在,這是糟糕的,災難性的。實際上,你將它輸入到REPL中,你將得到一個StackOverflow(嘿,這對於一個樂隊來說是個好名字!),並且一個堆棧跟蹤一千行。如果您想嘗試,請執行以下操作:
{ root.left = root }: Unit
壓制REPL善意嘗試打印結果。
但是爲了構建這一點,我必須專門給予案例級的可變成員,這是我在現實生活中永遠不會做的事情。如果我使用普通的可變成員,我會遇到建設問題。我能來最接近的是
case class Node(left: Option[Node], right: Option[Node])
val root: Node = Node(Some(loop), None)
然後root
有相當醜陋值Node(Some(null),None)
,但它仍然不是循環。所以我的問題是,如果一個數據結構是傳遞不變的(也就是說,它的所有成員都是不可變的值或對其本身是傳遞不變的其他數據結構的引用),它是否保證是非循環的?
它會很酷,如果它。
'class Loop {val self:Loop = this}'' – JimN