Wyrażenia kopiowania i aktualizowania
Aby zmniejszyć potrzebę powiązania modyfikowalnego, Q# obsługuje wyrażenia kopiowania i aktualizacji dla typów wartości z dostępem do elementów. Typy i tablice zdefiniowane przez użytkownika są niezmienne i należą do tej kategorii. Typy zdefiniowane przez użytkownika umożliwiają dostęp do elementów za pośrednictwem nazwy, natomiast tablice umożliwiają dostęp do elementów za pośrednictwem indeksu lub zakresu indeksów.
Wyrażenia copy-and-update tworzy wystąpienie nowej wartości ze wszystkimi elementami ustawionymi na odpowiednią wartość w oryginalnym wyrażeniu, 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 typu zdefiniowanego przez użytkownika lub wyrażeniem tablicy. Aby uzyskać odpowiednie wymagania dotyczące itemAccess
elementów i modification
, zobacz Kopiowanie i aktualizowanie typów zdefiniowanych przez użytkownika oraz Kopiowanie i aktualizowanie tablic.
Jeśli chodzi o pierwszeństwo, operator kopiowania i aktualizacji jest skojarzony z lewej 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 = Default<SequentialModel>()
w/ Structure <- ClassifierStructure()
w/ Parameters <- parameters
w/ Bias <- bias;
Jeśli chodzi o każdy operator, który tworzy wyrażenie tego samego typu co wyrażenie najbardziej lewe, jest dostępna odpowiednia instrukcja evaluate-and-reassign.
Na przykład dwie następujące instrukcje umożliwiają osiągnięcie następujących wartości: Pierwsza instrukcja deklaruje zmienną arr
modyfikowalny 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]
set arr w/= 0 <- 10; // arr contains [10, 0, 0]
Druga instrukcja jest po prostu krótka dla bardziej pełnej składni set arr = arr w/ 0 <- 10;
.
Kopiowanie i aktualizowanie typów zdefiniowanych przez użytkownika
Jeśli wartość original
jest typem zdefiniowanym przez użytkownika, itemAccess
oznacza nazwę elementu, który różni się od oryginalnej wartości. Nie jest to tylko inne wyrażenie, takie jak original
i modification
, ponieważ możliwość używania nazwy elementu bez dalszej kwalifikacji jest ograniczona do tego kontekstu; jest to jedno z dwóch wyrażeń kontekstowych w elemencie Q#.
Typ modification
wyrażenia musi być zgodny z typem nazwanego elementu, który się różni.
Jeśli na przykład complex
zawiera wartość Complex(0., 0.)
, gdzie typ Complex
jest zdefiniowany w tym miejscu, wówczas
complex w/ Re <- 1.
jest wyrażeniem typu Complex
, które daje wartość Complex(1., 0.)
.
Kopiowanie i aktualizowanie tablic
W przypadku tablic itemAccess
może być dowolne wyrażenie odpowiedniego typu. W tym kontekście prawidłowe są te same typy, które są prawidłowe dla fragmentowania tablicy. W konkretnym przypadku itemAccess
wyrażenie 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]
, to
arr w/ 0 <- 10
to tablica[10, 1, 2, 3]
.arr w/ 2 <- 10
to tablica[0, 1, 10, 3]
.arr w/ 0..2..3 <- [10, 12]
to tablica[10, 1, 12, 3]
.
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ść.
Microsoft.Quantum.Arrays
Przestrzeń nazw 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, daje w wyniku tablicę ze wszystkimi elementami ustawionymi na PauliI
wartość , z wyjątkiem elementu w indeksie i
, który jest ustawiony na PauliZ
wartość :
[PauliI, size = n] w/ i <- PauliZ
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla