我在理解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中哪种模型的身份比较.
在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)
这里存在多个间接层,这可能导致混乱.