Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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