Понимание реализации scala.collection.immutable.ListSet - PullRequest
0 голосов
/ 22 июня 2019

Я смотрю, как реализовано 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.

Не могли бы вы объяснить, как это работает?

1 Ответ

4 голосов
/ 22 июня 2019

Поскольку Node определяется как внутренний класс ListSet, каждый экземпляр Node автоматически содержит ссылку на экземпляр внешнего класса, в котором он был создан.

Вы можете получить доступ к этому экземплярувнешнего ListSet изнутри внутреннего класса с выражением ListSet.this

...