변수 선언 및 재할당
값은 let
및 mutable
문을 사용하여 기호에 바인딩할 수 있습니다.
이러한 종류의 바인딩은 정의된 핸들을 통해 값에 액세스하는 편리한 방법을 제공합니다.
다른 언어에서 차용된 잘못된 용어에도 불구하고 로컬 범위에 선언된 핸들과 값을 포함하는 핸들을mutable
문을 사용하여 지정됩니다.
let var1 = 3;
mutable var2 = 3;
var2 = var2 + 1;
이 예제에서 let
문은 다시 할당할 수 없는 var1
변수를 선언하고 항상 3
값을 포함합니다.
mutable
문은 3
값에 일시적으로 바인딩되지만 나중에 마지막 줄과 같이 할당 식을 사용할 때 다른 값으로 다시 할당할 수 있는 변수 var2
정의합니다. 다른 언어에서 흔히 볼 수 있는 것처럼 더 짧은 버전 var2 += 1;
동일한 문을 표현할 수 있습니다. 자세한 내용은 Evaluate 및 reassign 문참조하세요.
요약할 내용:
-
let
변경할 수 없는 바인딩을 만드는 데 사용됩니다. -
mutable
변경 가능한 바인딩을 만드는 데 사용됩니다. -
let
없는=
변경 가능한 바인딩의 값을 변경하는 데 사용됩니다.
세 문 모두에 대해 왼쪽은 기호 또는 기호 튜플로 구성됩니다. 바인딩의 오른쪽이 튜플인 경우 할당 시 해당 튜플이 완전히 또는 부분적으로 분해될 수 있습니다. 분해를 위한 유일한 요구 사항은 오른쪽에 있는 튜플의 모양이 왼쪽에 있는 기호 튜플의 모양과 일치한다는 것입니다. 기호 튜플에는 중첩된 튜플 또는 생략된 기호 또는 둘 다 밑줄로 표시될 수 있습니다. 예를 들어:
let (a, (_, b)) = (1, (2, 3)); // a is bound to 1, b is bound to 3
mutable (x, y) = ((1, 2), [3, 4]); // x is bound to (1, 2), y is bound to [3, 4]
(x, _, y) = ((5, 6), 7, [8]); // x is re-bound to (5,6), y is re-bound to [8]
래프 해제(
Q# 모든 할당은 큐비트 할당 및 루프 변수 할당을 포함하여 동일한 분해 규칙을 준수합니다.
두 종류의 바인딩에 대해 변수 형식은 바인딩의 오른쪽에서 유추됩니다. 변수의 형식은 항상 동일하게 유지되며 할당 식은 변경할 수 없습니다.
지역 변수는 변경 가능하거나 변경할 수 없는 것으로 선언할 수 있습니다. 동작이 미리 정의되고 지정할 수 없는 for
루프의 루프 변수와 같은 몇 가지 예외가 있습니다.
함수 및 연산 인수는 항상 변경할 수 없는 바인딩됩니다.
불변성 항목에서 설명한 것처럼 참조 형식의 부족과 함께 호출된 함수 또는 연산은 호출자 쪽의 값을 변경할 수 없음을 의미합니다.
Qubit
값의 상태는 Q#내에서 정의되거나 관찰할 수 없으므로 측정값을 통해서만 관찰할 수 있는 양자 부작용의 축적을 배제하지 않습니다. 자세한 내용은 Quantum 데이터 형식참조하세요.
값이 바인딩되는 방식과 관계없이 값 자체는 변경할 수 없습니다.
특히 배열 및 배열 항목에 해당합니다.
배열이 참조 형식인 인기 있는 클래식 언어와 달리 모든 형식과 마찬가지로 Q# 배열은 값 형식이며 항상 변경할 수 없습니다. 즉, 초기화 후에는 수정할 수 없습니다.
따라서 배열 형식 변수에서 액세스하는 값을 변경하려면 새 배열을 명시적으로 생성하고 동일한 기호에 다시 할당해야 합니다. 자세한 내용은
계산 및 재할당 문
intValue += 1;
양식의 문은 다른 많은 언어에서 일반적입니다. 여기서 intValue
Int
형식의 변경적으로 바인딩된 변수여야 합니다.
이러한 문은 오른쪽이 이진 연산자를 적용하는 것으로 구성되고 결과가 연산자의 왼쪽 인수에 리바운드되는 경우 편리한 연결 방법을 제공합니다.
예를 들어 이 코드 세그먼트
mutable counter = 0;
for i in 1 .. 2 .. 10 {
counter += 1;
// ...
}
for
루프의 각 반복에서 카운터 counter
값을 증가시키고
mutable counter = 0;
for i in 1 .. 2 .. 10 {
counter = counter + 1;
// ...
}
광범위한 연산자대해 유사한 문이 있습니다.
이러한 계산 및 재할당 식은 가장 왼쪽 하위 식의 형식이 식 형식과 일치하는 모든 연산자에서 존재합니다.
보다 정확하게 말하면 오른쪽 및 왼쪽 시프트, 지수 및 모듈러스를 포함한 산술 식, 연결뿐만 아니라 복사 및 업데이트 식
다음 함수 예제에서는 Complex
숫자 배열의 합계를 계산합니다.
function ComplexSum(values : Complex[]) : Complex {
mutable res = Complex(0., 0.);
for complex in values {
res = new Complex { Re = res.Re + complex.Re, Im = res.Im + complex.Im };
}
return res;
}
마찬가지로 다음 함수는 배열의 각 항목을 지정된 요소와 곱합니다.
function Multiplied(factor : Double, array : Double[]) : Double[] {
mutable res = new Double[Length(array)];
for i in IndexRange(res) {
res w/= i <- factor * array[i];
}
return res;
}
자세한 내용은 컴파일러에서 적절한 식을 유추할 수 있는 경우 특정 컨텍스트에서 식을 생략할 수 있는 다른 예제를 포함하는 컨텍스트 식참조하세요.