数组标识 - 是

Seb*_*raf 3 arrays identity d

我在理解D中的数组身份时遇到了问题.

Object s = null; // or new Object
auto a = [s];
auto b = [s];
writeln(a is b); // > false
writeln(a == b); // > true
Run Code Online (Sandbox Code Playgroud)

false然后打印出来true.我没有问题==,但在D2 ref中说明了这一点

对于静态和动态数组,identity定义为引用相同的数组元素和相同数量的元素.

这与我所经历的行为相矛盾.a并且b两者都有一个元素is s,因此它们应该是相同的.我误解了什么吗?

编辑:我错了认为相同的数组元素意味着他们比较相等,is在D中哪种模型的身份比较.

Pet*_*der 7

在D中,数组是指针和长度的元组.阵列是相同的,如果它们是相同的长度和指向相同的阵列.该是平等的,如果他们点什么的内容是相同的.

在你的榜样,a并且b是平等的,但不完全相同,因为他们不指向同一个阵列.如果他们这样做,修改a[0]也会修改b[0],但事实并非如此.

如果你有:

Object s = null;
auto a = [s];
auto b = a;
writeln(a is b); // > true
writeln(a == b); // > true
Run Code Online (Sandbox Code Playgroud)

然后他们都是真的,因为他们都指的是同一个数组.此外,在这种情况下,修改a[0]也会修改b[0].

这里的关键误解是每个数组的数组元素不相同,它们只是引用相同的元素:

            s
            ^
            |
       +----+----+
       |         |
      [0]       [0]
       ^         ^
       |         |
       a         b
Run Code Online (Sandbox Code Playgroud)

如果他们是相同的,你会有这样的事情:

            s
            ^
            |
           [0]
            ^
            |
       +----+----+
       |         |
       a         b
Run Code Online (Sandbox Code Playgroud)

这里存在多个间接层,这可能导致混乱.

  • 您的数组不引用相同的元素.它们指的是碰巧具有相同价值的不同元素.`a [0]`不是`b [0]`.修改一个不会修改另一个,因此它们不会引用相同的元素. (2认同)