Udostępnij za pośrednictwem


Niezmienność

Wszystkie typy w Q# to typy wartości . Q# nie ma pojęcia odwołania ani wskaźnika. Zamiast tego umożliwia ponowne przypisanie nowej wartości do wcześniej zadeklarowanej zmiennej za pomocą wyrażenia przypisania. Na przykład nie ma rozróżnienia między ponownym przypisaniami zmiennych typu Int lub zmiennych typu Int[]. Rozważ następującą sekwencję instrukcji:

    mutable arr1 = new Int[3];
    let arr2 = arr1;
    arr1 w/= 0 <- 3;

Pierwsza instrukcja tworzy wystąpienie nowej tablicy liczb całkowitych [0,0,0] i przypisuje ją do arr1. Następna instrukcja przypisuje tę wartość do zmiennej o nazwie arr2. Ostatnia instrukcja tworzy nowe wystąpienie tablicy na podstawie arr1 z tymi samymi wartościami, z wyjątkiem wartości indeksu 0 ustawionej na 3. Nowo utworzona tablica jest następnie przypisywana do zmiennej arr1. Ostatni wiersz korzysta ze skróconej składni dla instrukcji evaluate-and-reassign, i może być równoważne napisane jako arr1 = arr1 w/ 0 <- 1;.
Po uruchomieniu trzech instrukcji arr1 będzie zawierać wartość [3,0,0], podczas gdy arr2 pozostaje niezmieniona i zawiera wartość [0,0,0].

Q# wyraźnie rozróżnia niezmienność uchwytu i zachowanie typu. Możliwość mutowania w Q# to koncepcja, która ma zastosowanie do symbolu , a nie typu lub wartości; ma zastosowanie do uchwytu, który umożliwia dostęp do wartości, a nie do samej wartości. Nie jest to reprezentowane w systemie typów, niejawnie lub jawnie.

Oczywiście jest to jedynie opis formalnie zdefiniowanego zachowania; w rzeczywistości implementacja używa schematu zliczania odwołań, aby uniknąć kopiowania pamięci, jak to możliwe. Modyfikacja jest wykonywana tak długo, jak tylko jedna aktualnie prawidłowa obsługa, która uzyskuje dostęp do określonej wartości.