你知道那場景再見,謝謝你所有的魚亞瑟如此非常高興地停下來服務員,並要求知道,「爲什麼這樣的食物很好?」我正處於這種情況。斯卡拉似乎正在做我想做的事,但我不明白它是如何做到的。考慮以下內容:如何修改無列表?
scala> var v = Nil:List[String];
v: List[String] = List()
scala> v.length
res38: Int = 0
scala> v ::= "Hello"
scala> v.length
res39: Int = 1
scala> Nil.length
res40: Int = 0
這正是您希望的,但它是如何發生的?
Nil是一個擴展List [Nothing]的對象,它是List [String]的子類型,因此賦值工作正常,但它是一個不可變的列表,不是嗎?所以我不應該能夠追加到它。但是我可以追加到它,或者至少我可以追加到V,我認爲它指向無。 v被改變,但是Nil不是。
那麼,WTF? Scala有一些我不知道的聰明的copy-on-modify語義嗎? Nil真的是一個返回空列表的函數嗎?更廣泛地說,有沒有什麼方法可以讓REPL回答這些問題?