Share via


Inmutabilidad

Todos los tipos Q# son tipos de valor. Q# no tiene un concepto de referencia o puntero. En su lugar, le permite reasignar un nuevo valor a una variable declarada previamente mediante una instrucción set. Por ejemplo, no hay distinción en el comportamiento entre las reasignaciones de variables de tipo Int o variables de tipo Int[]. Considere la siguiente secuencia de instrucciones:

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

Las 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 llamada arr2. La última instrucción crea una nueva instancia de la matriz basada en arr1 con los mismos valores, excepto el valor del índice 0, que se establece en 3. Después, la matriz recién creada se asigna a la variable arr1. La última línea usa la sintaxis abreviada para las instrucciones evaluar y reasignar, y se podría haber escrito de forma equivalente como set arr1 = arr1 w/ 0 <- 1;.
Después de ejecutar las tres instrucciones, arr1 contendrá el valor [3,0,0], mientras que 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 en Q# es un concepto que se aplica a un símbolo en lugar de a un tipo o valor; se aplica al manipulador que permite acceder a un valor en lugar de al valor en sí. No se representa en el sistema de tipos, ni implícita ni explícitamente.

Por supuesto, se trata simplemente de una descripción del comportamiento definido formalmente; si indigamos, 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 de forma local siempre que solo haya un manipulador válido actualmente que acceda a un valor determinado.