다음을 통해 공유


식 복사 및 업데이트

변경 가능한 바인딩의 필요성을 줄이기 위해 Q# 인덱스 또는 인덱스 범위를 통해 항목에 액세스할 수 있는 배열에 대한 복사 및 업데이트 식을 지원합니다.

복사 및 업데이트 식은 지정된 특정 항목을 제외한 모든 항목이 원래 배열의 해당 값으로 설정된 새 배열을 인스턴스화합니다. 이 항목은 식의 오른쪽에 정의된 항목으로 설정됩니다. 3항 연산자 w/<-사용하여 생성됩니다. 구문 w/ "with"에 일반적으로 사용되는 짧은 표기법으로 읽어야 합니다.

    original w/ itemAccess <- modification

여기서 original 배열 식이고, itemAccess 배열 조각화에 유효한 식이며, modification 새 값 또는 값입니다. 구체적으로 itemAccess 식은 Int 형식이거나 Range수 있습니다. itemAccess Int형식의 값이면 modification 형식이 배열의 항목 형식과 일치해야 합니다. itemAccess Range형식의 값인 경우 modification 형식은 배열 형식과 동일해야 합니다.

예를 들어 arr 배열 [0, 1, 2, 3]포함하는 경우

  • arr w/ 0 <- 10 배열 [10, 1, 2, 3].
  • arr w/ 2 <- 10 배열 [0, 1, 10, 3].
  • arr w/ 0..2..3 <- [10, 12] 배열 [10, 1, 12, 3].

우선 순위 측면에서 copy-and-update 연산자는 왼쪽 연결 연산자이며 우선 순위가 가장 낮으며, 특히 범위 연산자(..) 또는 3차 조건 연산자(?|)보다 우선 순위가 낮습니다. 선택한 왼쪽 결합성을 사용하면 복사 및 업데이트 식을 쉽게 연결할 수 있습니다.

    let model = ArrayConstructor()
        w/ 1 <- alpha
        w/ 3 <- gamma
        w/ 5 <- epsilon;

가장 왼쪽에 있는 식과 동일한 형식의 식을 생성하는 연산자의 경우 해당 evaluate-and-reassign 문 사용할 수 있습니다. 예를 들어 다음 두 문은 다음을 수행합니다. 첫 번째 문은 변경 가능한 변수 arr 선언하고 정수 배열의 기본값에 바인딩합니다. 그런 다음 두 번째 문은 첫 번째 항목(인덱스 0 포함)이 10으로 설정된 새 배열을 빌드하고 arr다시 할당합니다.

    mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
    arr w/= 0 <- 10;             // arr contains [10, 0, 0] 

두 번째 문은 자세한 구문 arr = arr w/ 0 <- 10;짧습니다.

복사 및 업데이트 식을 사용하면 기존 배열을 기반으로 새 배열을 효율적으로 만들 수 있습니다. 복사 및 업데이트 식의 구현은 원하는 동작을 수행하는 데 필요한 부분만 복제하여 전체 배열을 복사하지 않도록 하고 가능한 경우 현재 위치 수정을 수행합니다. 따라서 배열 초기화는 불변성으로 인해 추가 오버헤드가 발생하지 않습니다.

Std.Arrays 네임스페이스는 배열 생성 및 조작을 위한 편리한 도구를 제공합니다.

복사 및 업데이트 식은 즉석에서 새 배열을 생성하는 편리한 방법입니다. 예를 들어 다음 식은 PauliZ설정된 인덱스 i항목을 제외하고 모든 항목이 PauliI설정된 배열로 계산됩니다.

[PauliI, size = n] w/ i <- PauliZ