Immuabilité
Tous les types dans Q# sont des types valeur.
Q# n’a pas de concept de référence ou de pointeur. À la place, il vous permet de réattribuer une nouvelle valeur à une variable déclarée précédemment avec une instruction set
. Par exemple, il n’y a aucune distinction de comportement entre les réattributions pour les variables de type Int
et les variables de type Int[]
. Considérons la séquence suivante d’instructions :
mutable arr1 = new Int[3];
let arr2 = arr1;
set arr1 w/= 0 <- 3;
La première instruction instancie un nouveau tableau d’entiers [0,0,0]
et l’attribue à arr1
.
L’instruction suivante affecte cette valeur à une variable portant le nom arr2
. La dernière instruction crée une nouvelle instance de tableau basée sur arr1
avec les mêmes valeurs, à l’exception de la valeur à l’index 0, qui est définie sur 3. Le tableau nouvellement créé est ensuite attribué à la variable arr1
. La dernière ligne utilise la syntaxe abrégée pour les instructions d’évaluation et de réattribution et peut aussi avoir été écrite sous la forme set arr1 = arr1 w/ 0 <- 1;
.
Après l’exécution des trois instructions, arr1
contient la valeur [3,0,0]
, alors que arr2
reste inchangé et contient la valeur [0,0,0]
.
Q# distingue donc clairement la mutabilité d’un descripteur et le comportement d’un type. La mutabilité dans Q# est un concept qui s’applique à un symbole plutôt qu’à un type ou à une valeur. Elle s’applique au descripteur qui vous autorise à accéder à une valeur plutôt qu’à la valeur elle-même. Elle n’est pas représentée de manière implicite ou explicite dans le système de type.
Bien entendu, il s’agit simplement d’une description du comportement formellement défini. En coulisses, l’implémentation réelle utilise un modèle de comptage de références pour éviter de copier la mémoire autant que possible. La modification est effectuée spécifiquement sur place, à condition qu’il y ait un seul descripteur actuellement valide qui accède à une certaine valeur.