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.