Espressioni di copia e aggiornamento
Per ridurre la necessità di associazioni modificabili, Q# supporta espressioni di copia e aggiornamento per le matrici, che consentono di accedere agli elementi tramite un indice o un intervallo di indici.
Le espressioni copy-and-update creano un'istanza di una nuova matrice con tutti gli elementi impostati sul valore corrispondente nella matrice originale, ad eccezione dei determinati elementi specificati, impostati su quelli definiti sul lato destro dell'espressione.
Vengono costruiti usando un operatore ternario w/
<-
; la sintassi w/
deve essere letta come notazione breve comunemente usata per "with":
original w/ itemAccess <- modification
dove original
è un'espressione di matrice, itemAccess
è qualsiasi espressione valida per il sezionamento della matrice e modification
è il nuovo valore o i nuovi valori. In concreto, l'espressione itemAccess
può essere di tipo Int
o Range
. Se itemAccess
è un valore di tipo Int
, il tipo di modification
deve corrispondere al tipo di elemento della matrice. Se itemAccess
è un valore di tipo Range
, il tipo di modification
deve essere uguale al tipo di matrice.
Ad esempio, se arr
contiene una matrice [0, 1, 2, 3]
,
-
arr w/ 0 <- 10
è la matrice[10, 1, 2, 3]
. -
arr w/ 2 <- 10
è la matrice[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
è la matrice[10, 1, 12, 3]
.
In termini di precedenza, l'operatore copy-and-update è associativa a sinistra e ha la precedenza più bassa e, in particolare, la precedenza inferiore rispetto all'operatore di intervallo (..
) o all'operatore condizionale ternario (?
|
).
L'associatività sinistra scelta consente di concatenare facilmente le espressioni di copia e aggiornamento:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Come per qualsiasi operatore che costruisce un'espressione dello stesso tipo dell'espressione più a sinistra coinvolta, è disponibile l'istruzione evaluate-and-reassign corrispondente arr
e la associa al valore predefinito di una matrice integer. La seconda istruzione compila quindi una nuova matrice con il primo elemento (con indice 0) impostato su 10 e lo riassegna a arr
.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
La seconda istruzione è semplicemente breve per la sintassi più dettagliata arr = arr w/ 0 <- 10;
.
Le espressioni di copia e aggiornamento consentono la creazione efficiente di nuove matrici in base a quelle esistenti. L'implementazione per le espressioni di copia e aggiornamento evita di copiare l'intera matrice duplicando solo le parti necessarie per ottenere il comportamento desiderato ed esegue una modifica sul posto, se possibile. Di conseguenza, le inizializzazioni di matrici non comportano un sovraccarico aggiuntivo a causa dell'immutabilità.
Lo spazio dei nomi Std.Arrays
fornisce un arsenale di strumenti pratici per la creazione e la manipolazione delle matrici.
Le espressioni di copia e aggiornamento rappresentano un modo pratico per costruire nuove matrici in tempo reale; L'espressione seguente, ad esempio, restituisce una matrice con tutti gli elementi impostati su PauliI
, ad eccezione dell'elemento in corrispondenza dell'indice i
, impostato su PauliZ
:
[PauliI, size = n] w/ i <- PauliZ