Sdílet prostřednictvím


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 PauliIs výjimkou položky v indexu i, která je nastavená na PauliZ:

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