Výrazy kopírování a aktualizace
Aby se snížila potřeba proměnlivých vazeb, Q# podporuje výrazy kopírování a aktualizace polí, které umožňují přístup k položkám prostřednictvím indexu nebo rozsahu indexů.
Výrazy kopírování a aktualizace vytvoří instanci nového pole se všemi položkami nastavenými na odpovídající hodnotu v původním poli s výjimkou určitých zadaných položek, které jsou nastavené na ty, které jsou definovány na pravé straně výrazu.
Jsou sestaveny pomocí ternárního operátoru w/
<-
; syntaxe w/
by se měla číst jako běžně používaný krátký zápis pro "with":
original w/ itemAccess <- modification
kde original
je maticový výraz, itemAccess
je libovolný výraz, který je platný pro řezy polí, a modification
je nová hodnota nebo hodnoty. Konkrétně může být výraz itemAccess
typu Int
nebo Range
. Pokud itemAccess
je hodnota typu Int
, musí typ modification
odpovídat typu položky pole. Pokud itemAccess
je hodnota typu Range
, typ modification
musí být stejný jako typ pole.
Pokud například arr
obsahuje [0, 1, 2, 3]
pole, pak
-
arr w/ 0 <- 10
je pole[10, 1, 2, 3]
. -
arr w/ 2 <- 10
je pole[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
je pole[10, 1, 12, 3]
.
Z hlediska priority je operátor copy-and-update asociativní a má nejnižší prioritu a zejména nižší prioritu než operátor rozsahu (..
) nebo ternární podmíněný operátor (?
|
).
Zvolená levá asociativita umožňuje snadné řetězení výrazů kopírování a aktualizace:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Pokud jde o jakýkoli operátor, který vytváří výraz stejného typu jako výraz nejvíce vlevo, je k dispozici odpovídající příkaz evaluate-and-reassign.
Následující dva příkazy například dosáhnou následujícího: První příkaz deklaruje proměnlivou proměnnou arr
a vytvoří vazbu na výchozí hodnotu celočíselného pole. Druhý příkaz pak vytvoří nové pole s první položkou (s indexem 0) nastaveným na 10 a znovu ho přiřadí arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
Druhý příkaz je jen krátká pro podrobnější syntaxi arr = arr w/ 0 <- 10;
.
Výrazy kopírování a aktualizace umožňují efektivní vytváření nových polí na základě existujících polí. Implementace výrazů copy-and-update zabraňuje kopírování celého pole duplikováním pouze nezbytných částí k dosažení požadovaného chování a pokud je to možné, provede místní úpravu. Inicializace polí proto neúčtují další režijní náklady kvůli neměnnosti.
Obor názvů Std.Arrays
poskytuje efektivní nástroje pro tvorbu a manipulaci s poli.
Výrazy kopírování a aktualizace představují pohodlný způsob, jak vytvořit nová pole za běhu; Následující výraz se například vyhodnotí jako pole se všemi položkami nastavenými na PauliI
s výjimkou položky v indexu i
, která je nastavená na PauliZ
:
[PauliI, size = n] w/ i <- PauliZ