Contextuele en weggelaten expressies
Contextuele expressies zijn expressies die alleen geldig zijn in bepaalde contexten, zoals het gebruik van itemnamen in expressies voor kopiëren en bijwerken zonder deze in aanmerking te hoeven komen.
Expressies kunnen worden weggelaten wanneer ze kunnen worden afgeleid en automatisch kunnen worden ingevoegd door de compiler, zoals instructies evalueren en opnieuw toewijzen.
Open-ended bereiken zijn een ander voorbeeld dat van toepassing is op zowel contextuele als weggelaten expressies. Ze zijn alleen geldig binnen een bepaalde context en de compiler vertaalt ze in normale Range
expressies tijdens de compilatie door geschikte grenzen uit te stellen.
Een waarde van het type Range
genereert een reeks gehele getallen, opgegeven door een beginwaarde, een stapwaarde (optioneel) en een eindwaarde. De letterlijke Range
expressie 1..3
bijvoorbeeld de reeks 1,2,3 genereert. Op dezelfde manier genereert de expressie 3..-1..1
de reeks 3,2,1. U kunt ook bereiken gebruiken om een nieuwe matrix te maken op basis van een bestaande door segmentering te gebruiken, bijvoorbeeld:
let arr = [1,2,3,4];
let slice1 = arr[1..2..4]; // contains [2,4]
let slice2 = arr[2..-1..0]; // contains [3,2,1]
U kunt geen oneindig bereik definiëren in Q#; de begin- en eindwaarden moeten altijd worden opgegeven. De enige uitzondering is wanneer u een Range
gebruikt om een matrix te segmenteren. In dat geval kan de compiler redelijkerwijs de begin- of eindwaarden van het bereik afleiden.
In de vorige voorbeelden van matrixsegmentering is het redelijk dat de compiler ervan uitgaat dat het beoogde bereikeind de index van het laatste item in de matrix moet zijn als de stapgrootte positief is. Als de stapgrootte negatief is, moet het bereikeinde waarschijnlijk de index zijn van het eerste item in de matrix, 0
. Het omgekeerde geldt voor het begin van het bereik.
Als u de beginwaarde van het bereik weglaat, wordt de uitgestelde beginwaarde samengevat
- is nul als er geen stap is opgegeven of als de opgegeven stap positief is.
- is de lengte van de matrix min één als de opgegeven stap negatief is.
Als u de eindwaarde van het bereik weglaat, wordt de uitgestelde eindwaarde
- is de lengte van de matrix min één als er geen stap is opgegeven of als de opgegeven stap positief is.
- is nul als de opgegeven stap negatief is.
Q# maakt het gebruik van open-ended bereiken binnen matrixslicing-expressies mogelijk, bijvoorbeeld:
let arr = [1,2,3,4,5,6];
let slice1 = arr[3...]; // slice1 is [4,5,6];
let slice2 = arr[0..2...]; // slice2 is [1,3,5];
let slice3 = arr[...2]; // slice3 is [1,2,3];
let slice4 = arr[...2..3]; // slice4 is [1,3];
let slice5 = arr[...2...]; // slice5 is [1,3,5];
let slice7 = arr[4..-2...]; // slice7 is [5,3,1];
let slice8 = arr[...-1..3]; // slice8 is [6,5,4];
let slice9 = arr[...-1...]; // slice9 is [6,5,4,3,2,1];
let slice10 = arr[...]; // slice10 is [1,2,3,4,5,6];
Omdat tijdens runtime wordt bepaald of de bereikstap positief of negatief is, voegt de compiler een geschikte expressie in die tijdens runtime wordt geëvalueerd. Voor weggelaten eindwaarden wordt de ingevoegde expressie step < 0 ? 0 | Length(arr)-1
en voor weggelaten beginwaarden wordt deze step < 0 ? Length(arr)-1 | 0
, waarbij step
de expressie is die is opgegeven voor de bereikstap of 1
als er geen stap is opgegeven.