Unbeweglichkeit
Alle Typen in Q# sind Werttypen.
Q# hat kein Konzept eines Bezugs oder Zeigers. Stattdessen können Sie einen neuen Wert einer zuvor deklarierten Variablen über einen Zuordnungsausdruck neu zuweisen. Es gibt z. B. keinen Unterschied im Verhalten zwischen Neuzuordnungen für Variablen vom Typ Int
oder Variablen vom Typ Int[]
. Beachten Sie die folgende Abfolge von Anweisungen:
mutable arr1 = new Int[3];
let arr2 = arr1;
arr1 w/= 0 <- 3;
Die erste Anweisung instanziiert ein neues Array von ganzen Zahlen [0,0,0]
und weist sie arr1
zu.
Die nächste Anweisung weist diesen Wert einer Variablen mit dem Namen arr2
zu. Die letzte Anweisung erstellt eine neue Arrayinstanz basierend auf arr1
mit denselben Werten, mit Ausnahme des Werts bei Index 0, der auf 3 festgelegt ist. Das neu erstellte Array wird dann der Variablen arr1
zugewiesen. In der letzten Zeile wird die abgekürzte Syntax für auswertenden und neu zugewiesenen Anweisungenverwendet, und sie könnten entsprechend als arr1 = arr1 w/ 0 <- 1;
geschrieben worden sein.
Nach dem Ausführen der drei Anweisungen enthält arr1
den Wert [3,0,0]
, während arr2
unverändert bleibt und den Wert [0,0,0]
enthält.
Q# unterscheidet somit eindeutig die Änderbarkeit eines Ziehpunkts und des Verhaltens eines Typs. Die Veränderbarkeit innerhalb Q# ist ein Konzept, das auf ein Symbol anstelle eines Typs oder Werts angewendet wird; sie gilt für das Handle, mit dem Sie nicht auf den Wert selbst, sondern auf einen Wert zugreifen können. Es ist nicht im Typsystem, implizit oder explizit dargestellt.
Natürlich ist dies lediglich eine Beschreibung des formal definierten Verhaltens; unter der Haube verwendet die tatsächliche Implementierung ein Referenzzählschema, um das Kopieren des Arbeitsspeichers so weit wie möglich zu vermeiden. Die Änderung erfolgt speziell, solange nur ein aktuell gültiger Handle vorhanden ist, der auf einen bestimmten Wert zugreift.