Partilhar via


Imutabilidade

Todos os tipos no Q# são tipos de valor. Q# não tem um conceito de referência ou ponteiro. Em vez disso, permite-lhe reatribuir um novo valor a uma variável declarada anteriormente através de uma set instrução. Por exemplo, não existe distinção no comportamento entre reatribuições para variáveis de tipo Int ou variáveis do tipo Int[]. Considere a seguinte sequência de instruções:

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

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

Q# desta forma, distingue a mutabilidade de um identificador e o comportamento de um tipo. A mutabilidade no Q# é um conceito que se aplica a um símbolo em vez de um tipo ou valor; aplica-se à alça que lhe permite aceder a um valor e não ao próprio valor. Não é representado no sistema de tipos, implicitamente ou explicitamente.

É claro que se trata apenas de uma descrição do comportamento formalmente definido; no bastidor, a implementação real utiliza um esquema de contagem de referências para evitar copiar a memória o máximo possível. A modificação é feita especificamente no local, desde que exista apenas uma alça atualmente válida que aceda a um determinado valor.