Wyrażenia kopiowania i aktualizacji
Aby zmniejszyć zapotrzebowanie na powiązania modyfikowalne, Q# obsługuje wyrażenia kopiowania i aktualizacji dla tablic, które umożliwiają dostęp do elementów za pośrednictwem indeksu lub zakresu indeksów.
Wyrażenia kopiowania i aktualizacji tworzy wystąpienie nowej tablicy ze wszystkimi elementami ustawionymi na odpowiednią wartość w oryginalnej tablicy, z wyjątkiem określonych elementów, które są ustawione na te zdefiniowane po prawej stronie wyrażenia.
Są one konstruowane przy użyciu operatoraternary w/
<-
; składnia w/
powinna być odczytywana jako powszechnie używana krótka notacja "with":
original w/ itemAccess <- modification
gdzie original
jest wyrażeniem tablicy, itemAccess
jest dowolnym wyrażeniem prawidłowym dla fragmentowania tablicy, a modification
jest nową wartością lub wartościami. Konkretnie wyrażenie itemAccess
może mieć typ Int
lub Range
. Jeśli itemAccess
jest wartością typu Int
, typ modification
musi być zgodny z typem elementu tablicy. Jeśli itemAccess
jest wartością typu Range
, typ modification
musi być taki sam jak typ tablicy.
Jeśli na przykład arr
zawiera tablicę [0, 1, 2, 3]
, wówczas
-
arr w/ 0 <- 10
jest tablicą[10, 1, 2, 3]
. -
arr w/ 2 <- 10
jest tablicą[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
jest tablicą[10, 1, 12, 3]
.
Jeśli chodzi o pierwszeństwo, operator kopiowania i aktualizacji jest lewo asocjacyjny i ma najniższy priorytet, a w szczególności niższy priorytet niż operator zakresu (..
) lubternary operator warunkowy (?
|
).
Wybrana łączność po lewej stronie umożliwia łatwe tworzenie łańcuchów wyrażeń kopiowania i aktualizacji:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Jeśli chodzi o dowolny operator tworzący wyrażenie tego samego typu co wyrażenie najbardziej lewe, odpowiedni instrukcji evaluate-and-reassign, jest dostępna.
Na przykład dwie następujące instrukcje umożliwiają osiągnięcie następujących wartości: Pierwsza instrukcja deklaruje zmienną modyfikowalny arr
i wiąże ją z wartością domyślną tablicy całkowitej. Druga instrukcja następnie tworzy nową tablicę z pierwszym elementem (z indeksem 0) ustawionym na 10 i ponownie przypisuje ją do arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
Druga instrukcja jest po prostu krótka dla bardziej pełnej składni arr = arr w/ 0 <- 10;
.
Wyrażenia kopiowania i aktualizacji umożliwiają wydajne tworzenie nowych tablic na podstawie istniejących. Implementacja wyrażeń kopiowania i aktualizacji pozwala uniknąć kopiowania całej tablicy przez duplikowanie tylko niezbędnych części do osiągnięcia żądanego zachowania i w miarę możliwości wykonuje modyfikację w miejscu. W związku z tym inicjowanie tablicy nie wiąże się z dodatkowym obciążeniem ze względu na niezmienność.
Przestrzeń nazw Std.Arrays
udostępnia arsenał wygodnych narzędzi do tworzenia tablicy i manipulowania nimi.
Wyrażenia kopiowania i aktualizacji to wygodny sposób konstruowania nowych tablic na bieżąco; Następujące wyrażenie, na przykład, oblicza tablicę ze wszystkimi elementami ustawionymi na PauliI
, z wyjątkiem elementu w indeksie i
, który jest ustawiony na PauliZ
:
[PauliI, size = n] w/ i <- PauliZ