Udostępnij za pośrednictwem


Niezmienność

Wszystkie typy w programie 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ą instrukcji set . 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; 
    set arr1 w/= 0 <- 3; 

Pierwsza instrukcja tworzy wystąpienie nowej tablicy liczb całkowitych [0,0,0] i przypisuje ją do klasy arr1. Następna instrukcja przypisuje tę wartość do zmiennej o nazwie arr2. Ostatnia instrukcja tworzy nowe wystąpienie tablicy na arr1 podstawie tych samych wartości, z wyjątkiem wartości indeksu 0, która jest ustawiona 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ównież zapisywany jako set arr1 = arr1 w/ 0 <- 1;.
Po uruchomieniu trzech instrukcji element będzie zawierać wartość[3,0,0], arr1 która arr2 pozostaje niezmieniona i zawiera wartość [0,0,0].

Q# w ten sposób rozróżnia niezmienność uchwytu i zachowanie typu. Mutability within Q# to pojęcie, które ma zastosowanie do symbolu , a nie typu lub wartości. Dotyczy to uchwytu, który umożliwia dostęp do wartości, a nie do samej wartości. Nie jest reprezentowany w systemie typów, niejawnie ani jawnie.

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