나는 문서를 읽고 있으며 언어의 디자인 결정 중 일부에서 끊임없이 머리를 흔들고 있습니다. 그러나 실제로 당황한 것은 배열을 처리하는 방법입니다.
나는 놀이터로 달려 가서 이것들을 시험해 보았다. 당신도 그들을 시도 할 수 있습니다. 첫 번째 예 :
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
입니다 [1, 2, 3, 42]
하지만 d
입니다 [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에서 변경 사항을 볼 수 없습니다.
요약하면 배열에 대한 공통 참조는 하나의 요소를 변경하면 변경 사항을 볼 수 있지만 여러 요소를 변경하거나 항목을 추가하면 사본이 만들어집니다.
이것은 나에게 매우 나쁜 디자인처럼 보입니다. 나는 이것을 생각하는 것이 맞습니까? 왜 배열이 이런 식으로 작동해야하는지 알 수없는 이유가 있습니까?
편집 : 배열이 변경되었으며 이제 값 의미가 있습니다. 훨씬 더 제정신!
std::shared_ptr
비 원자 버전이없는 이유를 물었을 때와 마찬가지로 의견이 아닌 사실에 근거한 답변이있었습니다 (사실은위원회가 그것을 고려했지만 여러 가지 이유로 그것을 원하지 않았다는 것입니다).