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, bijvoorbeeld in het geval van instructies voor evalueren en opnieuw toewijzen.
Open-eindbereiken 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 deze 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. Met de Range
letterlijke expressie 1..3
wordt bijvoorbeeld de reeks 1,2,3 gegenereerd. 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; Q#de begin- en eindwaarden moeten altijd worden opgegeven. De enige uitzondering is wanneer u een matrix segmenteert met een Range
matrix. In dat geval kunnen de begin- of eindwaarden van het bereik redelijkerwijs worden afgeleid door de compiler.
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];
Aangezien de bepaling of de bereikstap positief of negatief is tijdens runtime, voegt de compiler een geschikte expressie in die tijdens runtime wordt geëvalueerd. Voor weggelaten eindwaarden is step < 0 ? 0 | Length(arr)-1
de ingevoegde expressie en voor weggelaten beginwaarden is dit step < 0 ? Length(arr)-1 | 0
step
de expressie die is opgegeven voor de bereikstap of 1
als er geen stap is opgegeven.