Másolható és frissíthető kifejezések
A mutable kötések Q# szükségességének csökkentése érdekében támogatja az elemhozzáféréssel rendelkező értéktípusok másolási és frissítési kifejezéseit. A felhasználó által definiált típusok és tömbök nem módosíthatók, és ebbe a kategóriába tartoznak. A felhasználó által definiált típusok lehetővé teszik az elemek névvel való elérését, míg a tömbök lehetővé teszik az elemek elérését indexen vagy indextartományon keresztül.
A másolási és frissítési kifejezések létrehoznak egy új értéket, amelyben az összes elem az eredeti kifejezés megfelelő értékére van beállítva, kivéve bizonyos megadott elemeket, amelyek a kifejezés jobb oldalán definiált elemekre vannak beállítva.
Ternáris operátorral w/
<-
jönnek létre; a szintaxist w/
a "with" kifejezés gyakran használt rövid jelöléseként kell értelmezni:
original w/ itemAccess <- modification
ahol original
a felhasználó által definiált típusú kifejezés vagy tömbkifejezés. A megfelelő követelményekről itemAccess
a modification
felhasználó által definiált típusok másolása és frissítése, valamint a tömbök másolása és frissítése című témakörben olvashat.
Az elsőbbség szempontjából a másolási és frissítési operátor bal asszociatív, és a legalacsonyabb elsőbbséget élvezi, és különösen alacsonyabb elsőbbséget élvez, mint a tartomány operátora (..
) vagy a ternáris feltételes operátor (?
|
).
A választott bal asszociativitás lehetővé teszi a másolási és frissítési kifejezések egyszerű láncolását:
let model = Default<SequentialModel>()
w/ Structure <- ClassifierStructure()
w/ Parameters <- parameters
w/ Bias <- bias;
Mint minden olyan operátor esetében, amely a bal oldali kifejezéssel azonos típusú kifejezést hoz létre, elérhető a megfelelő kiértékelő és újraaláíró utasítás .
A következő két utasítás például a következőket éri el: Az első utasítás deklarál egy változót arr
, és egy egész tömb alapértelmezett értékéhez köti. A második utasítás ezután létrehoz egy új tömböt, amelyben az első elem (0 indexszel) 10-re van állítva, és újra hozzárendeli a következőhöz arr
: .
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
set arr w/= 0 <- 10; // arr contains [10, 0, 0]
A második utasítás csak rövid kézből áll a részletesebb szintaxishoz set arr = arr w/ 0 <- 10;
.
Felhasználó által definiált típusok másolása és frissítése
Ha az érték original
felhasználó által definiált típus, akkor itemAccess
annak az elemnek a nevét jelöli, amely eltér az eredeti értéktől. Ez nem csak egy másik kifejezés, például original
és modification
, mert az elemnév további minősítés nélkül való használatára csak erre a kontextusra korlátozódik, ez a két környezetfüggő kifejezés Q#egyike a .
A kifejezés típusának modification
meg kell egyeznie az elnevezett elem típusával, amely eltér.
Ha például complex
az értéket Complex(0., 0.)
tartalmazza , ahol a típus Complex
itt van definiálva, akkor
complex w/ Re <- 1.
A egy olyan típusú kifejezés, amely a Complex(1., 0.)
értéket Complex
értékeli ki.
Tömbök másolása és frissítése
Tömbök itemAccess
esetén a megfelelő típus tetszőleges kifejezése lehet; a tömb szeletelésére érvényes típusok ebben a kontextusban érvényesek. Konkrétan a itemAccess
kifejezés lehet típus Int
vagy Range
. Ha itemAccess
a típus Int
értéke, akkor a típusnak modification
meg kell egyeznie a tömb elemtípusával. Ha itemAccess
a típus Range
értéke, akkor a típusnak meg kell egyeznie modification
a tömb típusával.
Ha például arr
tömböt [0, 1, 2, 3]
tartalmaz, akkor
arr w/ 0 <- 10
a tömb[10, 1, 2, 3]
.arr w/ 2 <- 10
a tömb[0, 1, 10, 3]
.arr w/ 0..2..3 <- [10, 12]
a tömb[10, 1, 12, 3]
.
A másolási és frissítési kifejezések lehetővé teszik az új tömbök hatékony létrehozását a meglévők alapján. A másolási és frissítési kifejezések implementációja elkerüli a teljes tömb másolását úgy, hogy csak a szükséges részeket duplikálja a kívánt viselkedés eléréséhez, és lehetőség szerint helyben módosítja. Ezért a tömb inicializálásai nem járnak további többletterheléssel a nem módosíthatóság miatt.
A Microsoft.Quantum.Arrays
névtér a tömblétrehozáshoz és -kezeléshez használható eszközök széles választékát biztosítja.
A másolási és frissítési kifejezések kényelmesen hozhatnak létre új tömböket menet közben; a következő kifejezés például egy tömbre értékeli ki az összes elemet PauliI
, kivéve az indexben i
lévő elemet, amely a következőre PauliZ
van állítva:
[PauliI, size = n] w/ i <- PauliZ