共用方式為


變數宣告和重新指派

值可以使用 letmutable 語句系結至符號。 這類系結提供方便的方式,可透過定義的句柄存取值。 儘管從其他語言借用了誤導性的術語,但本機範圍和包含值的句柄稱為 變數。 這可能是誤導性的,因為 let 語句會定義 單一指派句柄,這是在有效期間仍系結至相同值的句柄。 程序代碼中不同點可以重新系結至不同值的變數,必須明確宣告為這類值,並使用 mutable 語句來指定。

    let var1 = 3; 
    mutable var2 = 3; 
    var2 = var2 + 1; 

在這裡範例中,let 語句會宣告名為 var1 的變數,該變數無法重新指派,且一律包含值 3mutable 語句會定義暫時系結至值 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#內定義或可觀察的,因此這不會排除量子副作用的累積,這些副作用只能透過測量來觀察。 如需詳細資訊,請參閱Quantum 數據類型。

與值系結方式無關,值本身是不可變的。 特別是陣列和陣列專案也是如此。 與常見的傳統語言相比,陣列通常是參考型別,Q# 中的陣列就像所有類型一樣,都是實值型別,而且一律不可變;也就是說,您無法在初始化之後修改它們。 因此,變更數位類型變數存取的值需要明確建構新的數位,並將它重新指派給相同的符號。 如需詳細資訊,請參閱不變性複製和更新表達式。

Evaluate-and-reassign 語句

表單 intValue += 1; 的語句在許多其他語言中很常見。 在這裡,intValue 必須是類型 Int的可變繫結變數。 如果右側包含套用二元運算符,而且結果會反彈至運算符的左自變數,則這類語句會提供方便的串連方式。 例如,此程式代碼區段

mutable counter = 0;
for i in 1 .. 2 .. 10 {
    counter += 1;
    // ...
}

遞增計數器的值,counterfor 迴圈的每個反覆運算中,相當於

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;
}

如需詳細資訊,請參閱 內容表達式,其中包含其他範例,當編譯程式可以推斷適當的表達式時,可以在特定內容中省略表達式。