arrays - 数组标识 - 是

标签 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

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

For static and dynamic arrays, identity is defined as referring to the same array elements and the same number of elements.

这与我经历的行为相矛盾。 ab 都有一个是s 的元素,因此它们应该是相同的。我误解了什么吗?

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

最佳答案

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

在您的示例中,ab 是相等的,但并不完全相同,因为它们不指向同一个数组。如果他们这样做了,修改 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

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

关于arrays - 数组标识 - 是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946225/

相关文章:

c - 在 C 中打印字符数组

javascript - 将对象数组添加到现有对象

java - 使用方法创建对象数组

java - 使用 "*.isInstance"的正确方向是什么?

templates - D 中的模板参数推断

javascript - 根据值排序数组对象

sql-server - 获取插入行的 PK Guid 的最佳方法

amazon-web-services - 跟踪 AWS Cognito 中的更改

d - 在 D 中等效退出?

d - 有没有办法自行托管 DUB 注册表?