代码之家  ›  专栏  ›  技术社区  ›  St.Antario

理解scala.collection.immutable不可变.ListSet在Scala中的实现

  •  0
  • St.Antario  · 技术社区  · 7 年前

    我在看 scala.collection.immutable.ListSet[T] 实施了at 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 回复  |  直到 7 年前
        1
  •  4
  •   Harald Gliebe Grzegorz Wierzowiecki    7 年前

    因为 Node ListSet 的每个实例 节点

    列表集 ListSet.this