我在理解 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.
这与我经历的行为相矛盾。 a
和b
都有一个是s
的元素,因此它们应该是相同的。我误解了什么吗?
编辑:我错误地认为相同的数组元素意味着它们在是
方面比较相等,哪种模型相同D 中的比较。
最佳答案
在 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
那么它们都为真,因为它们都引用同一个数组。此外,在这种情况下,修改 a[0]
也会修改 b[0]
。
这里的关键误解是每个数组的数组元素都不相同,它们只是引用相同的元素:
s
^
|
+----+----+
| |
[0] [0]
^ ^
| |
a b
如果它们是一样的,你会得到这样的结果:
s
^
|
[0]
^
|
+----+----+
| |
a b
这里有多个间接级别,这可能是造成混淆的原因。
关于arrays - 数组标识 - 是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946225/