불변
Int
형식의 변수에 대한 재할당이나 Int[]
형식의 변수 간에는 동작이 구분되지 않습니다. 다음 명령문 시퀀스를 고려합니다.
mutable arr1 = new Int[3];
let arr2 = arr1;
arr1 w/= 0 <- 3;
첫 번째 문은 [0,0,0]
새 정수 배열을 인스턴스화하고 arr1
할당합니다.
다음 문은 이름이 arr2
변수에 해당 값을 할당합니다. 마지막 문은 3으로 설정된 인덱스 0의 값을 제외하고 동일한 값을 가진 arr1
기반으로 새 배열 인스턴스를 만듭니다. 그러면 새로 만든 배열이 변수 arr1
할당됩니다. 마지막 줄은
세 문을 실행한 후 arr1
[3,0,0]
값을 포함하지만 arr2
변경되지 않은 상태로 유지되고 [0,0,0]
값이 포함됩니다.
Q# 핸들의 변경 가능성과 형식의 동작을 명확하게 구분합니다. Q# 내의 변경성은 형식이나 값이 아닌 기호 적용되는 개념입니다. 값 자체가 아닌 값에 액세스할 수 있는 핸들에 적용됩니다. 형식 시스템에 암시적 또는 명시적으로 표현되지 않습니다.
물론 이는 공식적으로 정의된 동작에 대한 설명일 뿐입니다. 내부적으로 실제 구현은 참조 계산 체계를 사용하여 메모리를 최대한 많이 복사하지 않도록 합니다. 수정은 특정 값에 액세스하는 현재 유효한 핸들이 하나만 있는 한 특별히 수행됩니다.