你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

复制和更新表达式

为了减少对可变绑定的需求,Q# 支持数组的复制和更新表达式,从而允许你通过索引或索引范围访问项。

复制和更新表达式实例化一个新数组,其中所有项都设置为原始数组中的相应值,但某些指定项除外,这些项设置为表达式右侧定义的项。 它们是使用三元运算符 w/<-构造的;语法 w/ 应读取为“with”的常用短表示法:

    original w/ itemAccess <- modification

其中 original 是数组表达式,itemAccess 是任何对数组切片有效的表达式,modification 是新值或值。 具体地说,itemAccess 表达式的类型可以是 IntRange。 如果 itemAccessInt类型的值,则 modification 的类型必须与数组的项类型匹配。 如果 itemAccessRange类型的值,则 modification 的类型必须与数组类型相同。

例如,如果 arr 包含数组 [0, 1, 2, 3],则

  • arr w/ 0 <- 10 是数组 [10, 1, 2, 3]
  • arr w/ 2 <- 10 是数组 [0, 1, 10, 3]
  • arr w/ 0..2..3 <- [10, 12] 是数组 [10, 1, 12, 3]

就优先级而言,复制和更新运算符是左关联运算符,优先级最低,特别是比范围运算符(..)或三元条件运算符(?|)低优先级。 选择的左关联性允许轻松链接复制和更新表达式:

    let model = ArrayConstructor()
        w/ 1 <- alpha
        w/ 3 <- gamma
        w/ 5 <- epsilon;

对于构造与最左侧表达式相同的类型的表达式的任何运算符,可以使用相应的 计算和重新分配语句。 例如,以下两个语句可实现以下目的:第一个语句声明可变变量 arr 并将其绑定到整数数组的默认值。 然后,第二个语句将生成一个新数组,其中第一项(索引 0)设置为 10,并将其重新分配给 arr

    mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
    arr w/= 0 <- 10;             // arr contains [10, 0, 0] 

第二个语句只是更详细语法 arr = arr w/ 0 <- 10;的短手。

复制和更新表达式允许基于现有数组高效创建新数组。 复制和更新表达式的实现通过仅复制必要的部分来实现所需的行为并执行就地修改(如果可能)来避免复制整个数组。 因此,由于不可变性,数组初始化不会产生额外的开销。

Std.Arrays 命名空间提供了用于创建和操作数组的便捷工具库。

复制和更新表达式是一种快速构造新数组的便捷方法;例如,以下表达式的计算结果为数组,其中所有项都设置为 PauliI,索引处的项 i除外,该数组设置为 PauliZ

[PauliI, size = n] w/ i <- PauliZ