Partilhar via


Imutabilidade

Todos os tipos em Q# são tipos de valor. Q# não tem um conceito de referência ou ponteiro. Em vez disso, ele permite que você reatribua um novo valor a uma variável declarada anteriormente por meio de uma expressão de atribuição. Por exemplo, não há distinção no comportamento entre reatribuições para variáveis do tipo Int ou variáveis do tipo Int[]. Considere a seguinte sequência de instruções:

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

A primeira instrução instancia uma nova matriz de inteiros [0,0,0] e a atribui a arr1. A próxima instrução atribui esse valor a uma variável com nome arr2. A última instrução cria uma nova instância de matriz com base em arr1 com os mesmos valores, exceto para o valor no índice 0, que é definido como 3. A matriz recém-criada é então atribuída à variável arr1. A última linha faz uso da sintaxe abreviada para avaliar e reatribuir instruções, e poderia ter sido escrita como arr1 = arr1 w/ 0 <- 1;.
Depois de executar as três instruções, arr1 conterá o valor [3,0,0] enquanto arr2 permanece inalterado e contém o valor [0,0,0].

Q# distingue claramente a mutabilidade de uma alça e o comportamento de um tipo. A mutabilidade dentro Q# é um conceito que se aplica a um símbolo em vez de um tipo ou valor; ele se aplica ao identificador que permite acessar um valor em vez de ao valor em si. É não representado no sistema de tipos, implícita ou explicitamente.

Naturalmente, esta é apenas uma descrição do comportamento formalmente definido; Sob o capô, a implementação real usa um esquema de contagem de referência para evitar a cópia de memória tanto quanto possível. A modificação é feita especificamente no local, desde que haja apenas um identificador atualmente válido que acesse um determinado valor.