다음을 통해 공유


변수 선언 및 재할당

값은 letmutable 문을 사용하여 기호에 바인딩할 수 있습니다. 이러한 종류의 바인딩은 정의된 핸들을 통해 값에 액세스하는 편리한 방법을 제공합니다. 다른 언어에서 차용된 잘못된 용어에도 불구하고 로컬 범위에 선언된 핸들과 값을 포함하는 핸들을변수라고 합니다. 문은 유효 기간 동안 동일한 값에 바인딩된 상태로 유지되는 핸들인단일 할당 핸들을 정의하기 때문에 오해의 소지가 있을 수 있습니다. 코드의 여러 지점에서 다른 값으로 다시 바인딩할 수 있는 변수는 명시적으로 선언되어야 하며 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]

래프 해제() 연산자를 사용한 분해에 대한 자세한 내용은구조체 형식에 대한 Item 액세스를 참조하세요.

Q# 모든 할당은 큐비트 할당 및 루프 변수 할당을 포함하여 동일한 분해 규칙을 준수합니다.

두 종류의 바인딩에 대해 변수 형식은 바인딩의 오른쪽에서 유추됩니다. 변수의 형식은 항상 동일하게 유지되며 할당 식은 변경할 수 없습니다. 지역 변수는 변경 가능하거나 변경할 수 없는 것으로 선언할 수 있습니다. 동작이 미리 정의되고 지정할 수 없는 for 루프의 루프 변수와 같은 몇 가지 예외가 있습니다. 함수 및 연산 인수는 항상 변경할 수 없는 바인딩됩니다. 불변성 항목에서 설명한 것처럼 참조 형식의 부족과 함께 호출된 함수 또는 연산은 호출자 쪽의 값을 변경할 수 없음을 의미합니다.

Qubit 값의 상태는 Q#내에서 정의되거나 관찰할 수 없으므로 측정값을 통해서만 관찰할 수 있는 양자 부작용의 축적을 배제하지 않습니다. 자세한 내용은 Quantum 데이터 형식참조하세요.

값이 바인딩되는 방식과 관계없이 값 자체는 변경할 수 없습니다. 특히 배열 및 배열 항목에 해당합니다. 배열이 참조 형식인 인기 있는 클래식 언어와 달리 모든 형식과 마찬가지로 Q# 배열은 값 형식이며 항상 변경할 수 없습니다. 즉, 초기화 후에는 수정할 수 없습니다. 따라서 배열 형식 변수에서 액세스하는 값을 변경하려면 새 배열을 명시적으로 생성하고 동일한 기호에 다시 할당해야 합니다. 자세한 내용은 불변성 및식 복사 및 업데이트 참조하세요.

계산 및 재할당 문

intValue += 1; 양식의 문은 다른 많은 언어에서 일반적입니다. 여기서 intValueInt형식의 변경적으로 바인딩된 변수여야 합니다. 이러한 문은 오른쪽이 이진 연산자를 적용하는 것으로 구성되고 결과가 연산자의 왼쪽 인수에 리바운드되는 경우 편리한 연결 방법을 제공합니다. 예를 들어 이 코드 세그먼트

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;
}

자세한 내용은 컴파일러에서 적절한 식을 유추할 수 있는 경우 특정 컨텍스트에서 식을 생략할 수 있는 다른 예제를 포함하는 컨텍스트 식참조하세요.