식 복사 및 업데이트
변경 가능한 바인딩의 필요성을 줄이기 위해 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