Поделиться через


Выражения копирования и обновления

Чтобы уменьшить потребность в изменяемых привязках, Q# поддерживает выражения копирования и обновления для массивов, которые позволяют получать доступ к элементам через индекс или диапазон индексов.

Выражения копирования и обновления создают экземпляр нового массива со всеми элементами, заданными соответствующим значением в исходном массиве, за исключением определенных указанных элементов, которые задаются в правой части выражения. Они создаются с помощью тернарного оператора w/<-; Синтаксис w/ следует считать как обычно используемую короткую нотацию для "with":

    original w/ itemAccess <- modification

где original является выражением массива, itemAccess является любым выражением, допустимым для срезов массива, и modification является новым значением или значениями. В конкретном случае выражение itemAccess может быть типом Int или Range. Если itemAccess является значением типа Int, то тип modification должен соответствовать типу элемента массива. Если itemAccess является значением типа Range, то тип 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]массива.

С точки зрения приоритета оператор copy-and-update является левым ассоциативным и имеет наименьший приоритет, а, в частности, более низкий приоритет, чем оператор диапазона (..) или тернарный условный оператор (?|). Выбранная левая ассоциативность позволяет легко цепочки выражений копирования и обновления:

    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