Я смотрю, как реализовано scala.collection.immutable.ListSet[T]
в 2.12, и у меня есть вопрос о том, как это работает:
sealed class ListSet[A] extends AbstractSet[A]
with Set[A]
with GenericSetTemplate[A, ListSet]
with SetLike[A, ListSet[A]]
with Serializable {
def +(elem: A): ListSet[A] = new Node(elem)
//...
protected class Node(override protected val elem: A) extends ListSet[A] with Serializable {
override def +(e: A): ListSet[A] = if (contains(e)) this else new Node(e)
//...
}
}
Как видно, Node.+(e: A)
просто создает новый узел с данным элементом. Как сохраняется ссылка на Node
, для которой был вызван +
? Метод next
реализован как
override protected def next: ListSet[A] = ListSet.this
, который должен дать нам ссылку на начальный пустой экземпляр ListSet
.
Не могли бы вы объяснить, как это работает?