Partager via


Immuabilité

Tous les types de Q# sont types valeur. Q# n’a pas de concept de référence ou de pointeur. Au lieu de cela, il vous permet de réaffecter une nouvelle valeur à une variable précédemment déclarée via une expression d’affectation. Par exemple, il n’existe aucune distinction dans le comportement entre les réaffectations pour les variables de type Int ou les variables de type Int[]. Considérez la séquence d’instructions suivante :

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

La première instruction instancie un nouveau tableau d’entiers [0,0,0] et l’affecte à arr1. L’instruction suivante affecte cette valeur à une variable portant le nom arr2. La dernière instruction crée une 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 affecté à la variable arr1. La dernière ligne utilise la syntaxe abrégée pour instructions evaluate-and-reassignation, et pourrait avoir été écrite de manière équivalente en tant que arr1 = arr1 w/ 0 <- 1;.
Après avoir exécuté les trois instructions, arr1 contiendra la valeur [3,0,0] tandis que arr2 reste inchangée et contient la valeur [0,0,0].

Q# distingue clairement la mutabilité d’un handle 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 handle qui vous permet d’accéder à une valeur plutôt qu’à la valeur elle-même. Il n’est pas représenté dans le système de type, implicitement ou explicitement.

Bien sûr, il s’agit simplement d’une description du comportement formellement défini ; sous le capot, l’implémentation réelle utilise un schéma de comptage de référence pour éviter de copier la mémoire autant que possible. La modification est spécifiquement effectuée tant qu’il n’existe qu’un seul handle actuellement valide qui accède à une certaine valeur.