Выражения копирования и обновления
Чтобы уменьшить потребность в изменяемых привязках, 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