Udostępnij za pośrednictwem


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