ドキュメントを読んでいて、言語の設計上の決定のいくつかに常に頭を悩ませています。しかし、本当に困惑したのは、配列の処理方法です。
私は遊び場に急いでこれらを試しました。あなたもそれらを試すことができます。だから最初の例:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
ここa
とb
は両方[1, 42, 3]
とも受け入れられます。配列が参照されています-OK!
次の例をご覧ください。
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c
is [1, 2, 3, 42]
BUT d
is [1, 2, 3]
です。つまりd
、前の例で変更を確認しましたが、この例では変更を確認していません。ドキュメントには、長さが変更されたためと記載されています。
さて、これはどうですか:
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
e
は[4, 5, 3]
、クールです。マルチインデックスの置換があると便利ですf
が、長さが変更されていなくても、STILLは変更を認識しません。
つまり、1つの要素を変更すると配列への共通の参照で変更が表示されますが、複数の要素を変更したり項目を追加したりすると、コピーが作成されます。
これは私には非常に貧弱なデザインのようです。私はこれを考えるのは正しいですか?配列がこのように動作する理由が表示されない理由はありますか?
編集:配列が変更され、値のセマンティクスが追加されました。はるかに正気!
std::shared_ptr
非アトミックバージョンがないのかと尋ねたときのように、意見ではなく事実に基づいて回答がありました(事実は、委員会が検討したが、さまざまな理由でそれを望まなかったという事実です)。