Copiar e atualizar expressões
Para reduzir a necessidade de ligações mutáveis, o Q# suporta expressões de cópia e atualização para matrizes, que permitem acessar itens por meio de um índice ou intervalo de índices.
As expressões de copiar e atualizar instanciam uma nova matriz com todos os itens definidos para o valor correspondente na matriz original, exceto os itens especificados, que são definidos como os definidos no lado direito da expressão.
Eles são construídos usando um operador ternário w/
<-
; A sintaxe w/
deve ser lida como a notação curta comumente usada para "com":
original w/ itemAccess <- modification
onde original
é uma expressão de matriz, itemAccess
é qualquer expressão válida para fatiamento de matriz, e modification
é o novo valor ou valores. Concretamente, a expressão itemAccess
pode ser do tipo Int
ou Range
. Se itemAccess
for um valor do tipo Int
, então o tipo de modification
deve corresponder ao tipo de item da matriz. Se itemAccess
for um valor do tipo Range
, então o tipo de modification
deve ser o mesmo que o tipo de matriz.
Por exemplo, se arr
contiver uma matriz [0, 1, 2, 3]
, então
-
arr w/ 0 <- 10
é a matriz[10, 1, 2, 3]
. -
arr w/ 2 <- 10
é a matriz[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
é a matriz[10, 1, 12, 3]
.
Em termos de precedência, o operador copy-and-update é associativo à esquerda e tem a menor precedência e, em particular, menor precedência do que o operador de intervalo (..
) ou o operador condicional ternário (?
|
).
A associatividade à esquerda escolhida permite o encadeamento fácil de expressões de cópia e atualização:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Como para qualquer operador que constrói uma expressão do mesmo tipo que a expressão mais à esquerda envolvida, a correspondente arr
e a vincula ao valor padrão de uma matriz inteira. A segunda instrução então cria uma nova matriz com o primeiro item (com índice 0) definido como 10 e o reatribui a arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
A segunda afirmação é apenas uma abreviatura para a sintaxe mais detalhada arr = arr w/ 0 <- 10;
.
As expressões de copiar e atualizar permitem a criação eficiente de novas matrizes com base nas existentes. A implementação para expressões de cópia e atualização evita copiar todo o array duplicando apenas as partes necessárias para alcançar o comportamento desejado e executa uma modificação in-loco, se possível. Assim, as inicializações de matriz não incorrem em sobrecarga adicional devido à imutabilidade.
O namespace Std.Arrays
fornece um arsenal de ferramentas convenientes para criação e manipulação de matrizes.
As expressões de copiar e atualizar são uma maneira conveniente de construir novas matrizes em tempo real; A expressão a seguir, por exemplo, é avaliada como uma matriz com todos os itens definidos como PauliI
, exceto o item no índice i
, que é definido como PauliZ
:
[PauliI, size = n] w/ i <- PauliZ