了解scala.collection.immutable.ListSet实现

时间:2019-06-22 19:50:03

标签: scala collections set

我正在研究如何实现2.12的for,并对其工作方式有疑问:

public class test {
    public static void main(String [] args) {
        System.out.println("Hello World!");

        int a = 7;
        System.out.println("A is Prime: " + isPrime(a));
        System.out.println();

        int b = 4;
        System.out.println("B is Prime: " + isPrime(b));
        System.out.println();

        int c = -7;
        System.out.println("C is Prime: " + isPrime(c));
        System.out.println();

        int d = 53;
        System.out.println("D is Prime: " + isPrime(d));
    }

    public static boolean isPrime(int p) {
        for (int i = 2; i < p; i++) {
            if (p < 2 || p % i == 0) {
                 return false;
            }
        }
        return true;
    }
}

可以看出,scala.collection.immutable.ListSet[T]只是使用给定的元素创建了一个新的Node。如何保留对在其上调用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) //... } } 的{​​{1}}的引用? Node.+(e: A)方法的实现方式为

Node

这应该为我们提供对初始空+实例的引用。

您能解释一下它是如何工作的吗?

1 个答案:

答案 0 :(得分:4)

由于Node被定义为ListSet的内部类,因此Node的每个实例都会自动包含对其创建的外部类实例的引用。

您可以使用表达式ListSet从内部类内部访问外部ListSet.this的此实例