Понимание операции добавления ListBuffer в Scala. Изменчивый или неизменный хвост?
Вот код из метода добавления ListBuffers:
def += (x: A): this.type = {
...
last0 = new :: (x, Nil)
last1.tl = last0 <-------- compiler is complaining Reassignment to val
...
}
Когда я нажимаю Ctrl+ клик по классу ColonColon (который по сути является списком), я получаю
package scala.collection.immutable
@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
с переменным тл. Но когда я нажимаю на метод.tl, я получаю
package scala.collection.immutable
@scala.SerialVersionUID(value = 509929039250432923)
final case class ::[B](override val head : B, private[scala] val tl : scala.collection.immutable.List[B]) extends scala.collection.immutable.List[B] with scala.Product with scala.Serializable {
override def tail : scala.collection.immutable.List[B] = { /* compiled code */ }
override def isEmpty : scala.Boolean = { /* compiled code */ }
}
с долей тл.
Может кто-нибудь объяснить, что здесь происходит?