다음을 통해 공유


불변

모든 형식은값 형식입니다. Q# 참조 또는 포인터의 개념이 없습니다. 대신 할당 식을 통해 이전에 선언된 변수에 새 값을 다시 할당할 수 있습니다. 예를 들어 Int 형식의 변수에 대한 재할당이나 Int[]형식의 변수 간에는 동작이 구분되지 않습니다. 다음 명령문 시퀀스를 고려합니다.

    mutable arr1 = new Int[3];
    let arr2 = arr1;
    arr1 w/= 0 <- 3;

첫 번째 문은 [0,0,0] 새 정수 배열을 인스턴스화하고 arr1할당합니다. 다음 문은 이름이 arr2변수에 해당 값을 할당합니다. 마지막 문은 3으로 설정된 인덱스 0의 값을 제외하고 동일한 값을 가진 arr1 기반으로 새 배열 인스턴스를 만듭니다. 그러면 새로 만든 배열이 변수 arr1할당됩니다. 마지막 줄은evaluate-and-reassign 문에 대해 축약된 구문을 사용하며 작성되었을 수도 있습니다.
세 문을 실행한 후 arr1[3,0,0] 값을 포함하지만 arr2 변경되지 않은 상태로 유지되고 [0,0,0]값이 포함됩니다.

Q# 핸들의 변경 가능성과 형식의 동작을 명확하게 구분합니다. Q# 내의 변경성은 형식이나 값이 아닌 기호 적용되는 개념입니다. 값 자체가 아닌 값에 액세스할 수 있는 핸들에 적용됩니다. 형식 시스템에 암시적 또는 명시적으로 표현되지 않습니다.

물론 이는 공식적으로 정의된 동작에 대한 설명일 뿐입니다. 내부적으로 실제 구현은 참조 계산 체계를 사용하여 메모리를 최대한 많이 복사하지 않도록 합니다. 수정은 특정 값에 액세스하는 현재 유효한 핸들이 하나만 있는 한 특별히 수행됩니다.