Inmutabilidad
Todos los tipos de Q# son tipos de valor .
Q# no tiene un concepto de referencia o puntero. En su lugar, permite reasignar un nuevo valor a una variable declarada previamente a través de una expresión de asignación. Por ejemplo, no hay distinción en el comportamiento entre reasignaciones para variables de tipo Int
o variables de tipo Int[]
. Tenga en cuenta la siguiente secuencia de instrucciones:
mutable arr1 = new Int[3];
let arr2 = arr1;
arr1 w/= 0 <- 3;
La primera instrucción crea una instancia de una nueva matriz de enteros [0,0,0]
y la asigna a arr1
.
La siguiente instrucción asigna ese valor a una variable con el nombre arr2
. La última instrucción crea una nueva instancia de matriz basada en arr1
con los mismos valores, excepto el valor en el índice 0, que se establece en 3. A continuación, la matriz recién creada se asigna a la variable arr1
. La última línea usa la sintaxis abreviada para instrucciones evaluate-and-reassign, y podría haberse escrito de forma equivalente como arr1 = arr1 w/ 0 <- 1;
.
Después de ejecutar las tres instrucciones, arr1
contendrá el valor [3,0,0]
mientras arr2
permanece sin cambios y contiene el valor [0,0,0]
.
Q# distingue claramente la mutabilidad de un identificador y el comportamiento de un tipo. La mutabilidad dentro de Q# es un concepto que se aplica a un símbolo de en lugar de un tipo o valor; se aplica al identificador que le permite acceder a un valor en lugar del propio valor. No se representado en el sistema de tipos, implícita o explícitamente.
Por supuesto, esto es simplemente una descripción del comportamiento formalmente definido; en segundo plano, la implementación real usa un esquema de recuento de referencias para evitar copiar la memoria tanto como sea posible. La modificación se realiza específicamente en su lugar siempre que solo haya un identificador actualmente válido que tenga acceso a un valor determinado.