Вы знаете ту сцену в До свидания и спасибо всем рыбам , где Артур так безумно счастлив, что останавливает официанта и требует знать: «Почему эта еда такая хорошая?»Я в такой ситуации.Кажется, что Scala делает именно то, что я хочу, но я не понимаю, как это происходит.Рассмотрим следующее:
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 какая-то умная семантика копирования-на-изменении, о которой я не знаю?Действительно ли Nil - это функция, которая возвращает пустые списки?В более широком смысле, есть ли способ, которым я мог бы заставить REPL ответить на эти вопросы?