3

Dの配列IDを理解するのに問題があります。

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

これはfalse、次に、を出力しtrueます。に問題はありません==が、D2refには次のように記載されています。

静的配列と動的配列の場合、IDは、同じ配列要素と同じ数の要素を参照するものとして定義されます。

これは私が経験する行動と矛盾します。両方に1つの要素がありa、それらは同一である必要があります。私は何かを誤解していますか?bis s

編集:私は間違って、同じ配列要素isは、Dでの同一性比較の種類のモデルの点で同等に比較されることを意味すると信じていました。

4

1 に答える 1

7

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

ここには複数のレベルの間接参照があり、これがおそらく混乱を引き起こしている原因です。

于 2013-02-18T22:20:31.723 に答える