3

我在理解 D 中的数组标识时遇到问题。

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

这打印false,然后true。我对 没有问题==,但在D2 ref中指出

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

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

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

4

1 回答 1

7

在 D 中,数组是指针和长度的元组。如果它们的长度相同并且指向相同的数组,则这些数组是相同的。如果它们指向的内容相同,则它们相等。

在您的示例中,aandb是相等的,但不相同,因为它们不指向同一个数组。如果他们这样做了,修改a[0]也会修改b[0],但它不会。

如果你有:

Object s = null;
auto a = [s];
auto b = a;
writeln(a is b); // > true
writeln(a == b); // > true

那么它们都是真的,因为它们都引用同一个数组。此外,在这种情况下,修改a[0]也会修改b[0]

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

            s
            ^
            |
       +----+----+
       |         |
      [0]       [0]
       ^         ^
       |         |
       a         b

如果它们是相同的,你会有这样的东西:

            s
            ^
            |
           [0]
            ^
            |
       +----+----+
       |         |
       a         b

这里有多个间接级别,这可能是造成混乱的原因。

于 2013-02-18T22:20:31.723 回答