Partilhar via


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 instrução avaliar-e-reatribuir está disponível. As duas instruções a seguir, por exemplo, alcançam o seguinte: A primeira instrução declara uma variável mutável 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