Partilhar via


Expressões copiar-e-atualizar

Para reduzir a necessidade de associações mutáveis, Q# suporta expressões de cópia e atualização para tipos de valor com acesso a itens. Tipos e matrizes definidos pelo usuário são imutáveis e se enquadram nessa categoria. Os tipos definidos pelo usuário permitem que você acesse itens por meio do nome, enquanto as matrizes permitem que você acesse itens por meio de um índice ou intervalo de índices.

As expressões de copiar e atualizar instanciam um novo valor com todos os itens definidos para o valor correspondente na expressão original, exceto alguns itens especificados, que são definidos como os definidos no lado direito da expressão. Eles são construídos usando um operador w/ <-ternário, 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 tipo definido pelo usuário ou uma expressão de matriz. Para obter os requisitos correspondentes para itemAccess e , consulte Cópia e atualização de tipos definidos pelo usuário e Cópia e atualização de matrizesmodification.

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 = Default<SequentialModel>()
        w/ Structure <- ClassifierStructure()
        w/ Parameters <- parameters
        w/ Bias <- bias;

Como para qualquer operador que constrói uma expressão do mesmo tipo que a expressão mais à esquerda envolvida, a instrução evaluate-and-reassign correspondente está disponível. As duas instruções a seguir, por exemplo, alcançam o seguinte: A primeira instrução declara uma variável arr mutável e a vincula ao valor padrão de uma matriz inteira. Em seguida, a segunda instruçã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]
    set arr w/= 0 <- 10;      // arr contains [10, 0, 0] 

A segunda afirmação é apenas uma abreviatura para a sintaxe set arr = arr w/ 0 <- 10;mais detalhada.

Cópia e atualização de tipos definidos pelo usuário

Se o valor original for um tipo definido pelo usuário, denotará itemAccess o nome do item que diverge do valor original. Esta não é apenas mais uma expressão, como original e modification, porque a capacidade de usar o nome do item sem qualquer qualificação adicional é limitada a este contexto, é uma das duas expressões contextuais em Q#.

O tipo da modification expressão precisa corresponder ao tipo do item nomeado que diverge. Por exemplo, se complex contém o valor Complex(0., 0.), onde o tipo Complex é definido aqui, então

complex w/ Re <- 1. 

é uma expressão do tipo Complex que avalia como Complex(1., 0.).

Cópia e atualização de matrizes

Para matrizes, pode ser uma expressão arbitrária de um tipo adequado, itemAccess os mesmos tipos que são válidos para fatiamento de matriz são válidos neste contexto. Concretamente, a itemAccess expressão pode ser do tipo Int ou Range. Se itemAccess é um valor do tipo Int, então o tipo de tem que corresponder ao tipo de modification item da matriz. Se itemAccess é um valor do tipo Range, então o tipo de tem que ser o mesmo que o tipo de modification 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].

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 Microsoft.Quantum.Arrays namespace 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