變數宣告和重新指派
值可以使用 let
和 mutable
語句系結至符號。
這類系結提供方便的方式,可透過定義的句柄存取值。
儘管從其他語言借用了誤導性的術語,但本機範圍和包含值的句柄稱為 變數。
這可能是誤導性的,因為 let
語句會定義 單一指派句柄,這是在有效期間仍系結至相同值的句柄。 程序代碼中不同點可以重新系結至不同值的變數,必須明確宣告為這類值,並使用 mutable
語句來指定。
let var1 = 3;
mutable var2 = 3;
var2 = var2 + 1;
在這裡範例中,let
語句會宣告名為 var1
的變數,該變數無法重新指派,且一律包含值 3
。
mutable
語句會定義暫時系結至值 3
的變數 var2
,但稍後可以使用指派表達式重新指派給不同的值,如最後一行所示。 您可以使用較短的版本 var2 += 1;
來表達相同的語句,如同其他語言的常見。 如需詳細資訊,請參閱 評估及重新指派語句。
總結:
-
let
用來建立不可變的系結。 -
mutable
可用來建立可變動的系結。 - 沒有
let
的=
用來變更可變動系結的值。
針對這三個語句,左側是由符號或符號元組所組成。 如果系結的右側是 Tuple,則在指派時,該 Tuple 可能會完全或部分解構。 解構的唯一需求是右側 Tuple 的形狀符合左側符號元組的形狀。 符號元組可能包含巢狀元組或省略的符號,或兩者,以底線表示。 例如:
let (a, (_, b)) = (1, (2, 3)); // a is bound to 1, b is bound to 3
mutable (x, y) = ((1, 2), [3, 4]); // x is bound to (1, 2), y is bound to [3, 4]
(x, _, y) = ((5, 6), 7, [8]); // x is re-bound to (5,6), y is re-bound to [8]
如需使用 unwrap (!
) 運算符解構的詳細資訊,請參閱 結構類型的專案存取。
Q# 中的所有指派都遵守相同的解構規則,例如量子位配置和迴圈變數指派。
針對這兩種系結,變數的類型是從系結的右側推斷而來。 變數的類型一律保持不變,而且指派表達式無法變更它。
局部變數可以宣告為可變或不可變數。 有一些例外狀況,例如 for
迴圈中的循環變數,其中行為已預先定義且無法指定。
函式和作業自變數一律是不變的系結。 結合缺乏參考型別,如 不變性 主題中所述,這表示呼叫的函式或作業永遠無法變更呼叫端的任何值。
由於 Qubit
值的狀態不是從 Q#內定義或可觀察的,因此這不會排除量子副作用的累積,這些副作用只能透過測量來觀察。 如需詳細資訊,請參閱
與值系結方式無關,值本身是不可變的。
特別是陣列和陣列專案也是如此。
與常見的傳統語言相比,陣列通常是參考型別,Q# 中的陣列就像所有類型一樣,都是實值型別,而且一律不可變;也就是說,您無法在初始化之後修改它們。
因此,變更數位類型變數存取的值需要明確建構新的數位,並將它重新指派給相同的符號。 如需詳細資訊,請參閱
Evaluate-and-reassign 語句
表單 intValue += 1;
的語句在許多其他語言中很常見。 在這裡,intValue
必須是類型 Int
的可變繫結變數。
如果右側包含套用二元運算符,而且結果會反彈至運算符的左自變數,則這類語句會提供方便的串連方式。
例如,此程式代碼區段
mutable counter = 0;
for i in 1 .. 2 .. 10 {
counter += 1;
// ...
}
遞增計數器的值,counter
在 for
迴圈的每個反覆運算中,相當於
mutable counter = 0;
for i in 1 .. 2 .. 10 {
counter = counter + 1;
// ...
}
各種 運算子也有類似的語句。 所有運算子都有這樣的評估與重新指派表達式,其中最左邊子表達式的類型符合表達式類型。 更精確地說,它們適用於二進位邏輯和位運算符,包括向右和左移、算術表達式,包括指數和模數,以及串連,以及 複製和更新表達式。
下列函式範例會計算 Complex
數字數位數組的總和:
function ComplexSum(values : Complex[]) : Complex {
mutable res = Complex(0., 0.);
for complex in values {
res = new Complex { Re = res.Re + complex.Re, Im = res.Im + complex.Im };
}
return res;
}
同樣地,下列函式會將數位中的每個專案乘以指定的因素:
function Multiplied(factor : Double, array : Double[]) : Double[] {
mutable res = new Double[Length(array)];
for i in IndexRange(res) {
res w/= i <- factor * array[i];
}
return res;
}
如需詳細資訊,請參閱 內容表達式,其中包含其他範例,當編譯程式可以推斷適當的表達式時,可以在特定內容中省略表達式。