你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
变量声明和重新分配
值可以使用 let
和 mutable
语句绑定到符号。
这些类型的绑定提供了一种通过定义的句柄访问值的便捷方法。
尽管从其他语言中借用了误导性术语,但在本地范围内声明并包含值的句柄 变量。
这可能是误导性的,因为 let
语句定义 单赋值句柄,这些句柄在有效期内仍绑定到相同的值。 需要在代码的不同点上重新绑定到不同值的变量需要显式声明为此类变量,并使用 mutable
语句指定。
let var1 = 3;
mutable var2 = 3;
var2 = var2 + 1;
在此示例中,let
语句声明一个名为 var1
的变量,该变量不能重新分配,并且始终包含值 3
。
mutable
语句定义一个变量 var2
,该变量暂时绑定到值 3
,但以后可以使用赋值表达式重新分配给其他值,如最后一行所示。 可以使用较短的版本 var2 += 1;
来表达相同的语句,就像其他语言中一样。 有关详细信息,请参阅 评估和重新分配语句。
总结:
-
let
用于创建不可变绑定。 -
mutable
用于创建可变绑定。 - 不使用
let
=
用于更改可变绑定的值。
对于这三个语句,左侧由符号或符号元组组成。 如果绑定的右侧是元组,则在赋值时,该元组可能是完全或部分析构的。 解构的唯一要求是右侧元组的形状与左侧符号元组的形状匹配。 符号元组可能包含嵌套元组或省略的符号,或者两者都由下划线指示。 例如:
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]
有关使用解包(!
)运算符解构的详细信息,请参阅 项访问结构类型。
Q# 中的所有赋值都遵循相同的析构规则,例如量子比特分配和循环变量赋值。
对于这两种类型的绑定,变量的类型是从绑定的右侧推断的。 变量的类型始终保持不变,赋值表达式无法更改它。
局部变量可以声明为可变变量或不可变变量。 存在一些异常,例如 for
循环中的循环变量,其中行为是预定义的,无法指定。
函数和操作参数始终是不变的绑定。 结合缺少引用类型,如 不可变性 主题中所述,这意味着调用的函数或操作永远无法更改调用方端的任何值。
由于 Qubit
值的状态在 Q#内未定义或可观测,因此这并不排除量子副作用的累积,这些副作用只能通过测量来观测。 有关详细信息,请参阅 Quantum 数据类型。
与值绑定的方式无关,值本身是不可变的。 具体而言,数组和数组项也是如此。 与数组通常为引用类型的常用经典语言相比,Q# 中的数组(如所有类型)都是值类型,始终是不可变的;也就是说,初始化后不能修改它们。 更改数组类型变量访问的值需要显式构造新数组并将其重新分配给同一个符号。 有关详细信息,请参阅 不可变性 和 复制和更新表达式。
Evaluate-and-reassign 语句
表单 intValue += 1;
的语句在许多其他语言中很常见。 在这里,intValue
必须是类型 Int
的可变绑定变量。
如果右侧包含应用二进制运算符,并且结果将反弹到运算符的左侧参数,则此类语句提供了一种便捷的串联方式。
例如,此代码段
mutable counter = 0;
for i in 1 .. 2 .. 10 {
counter += 1;
// ...
}
在 for
循环的每个迭代中递增计数器 counter
的值,等效于
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;
}
有关详细信息,请参阅 上下文表达式,其中包含其他示例,当编译器可以推断合适的表达式时,可以在特定上下文中省略表达式。