Kontextuella och utelämnade uttryck
Kontextuella uttryck är uttryck som endast är giltiga i vissa kontexter, till exempel användning av objektnamn i kopierings- och uppdateringsuttryck utan att behöva kvalificera dem.
Uttryck kan utelämnas när de kan härledas och infogas automatiskt av kompilatorn, till exempel när det gäller att utvärdera och omtilldela instruktioner.
Öppna intervall är ett annat exempel som gäller både kontextuella och utelämnade uttryck. De är endast giltiga i en viss kontext och kompilatorn översätter dem till normala Range
uttryck under kompileringen genom att härleda lämpliga gränser.
Ett värde av typen Range
genererar en sekvens med heltal som anges av ett startvärde, ett stegvärde (valfritt) och ett slutvärde. Till exempel Range
genererar literaluttrycket 1..3
sekvensen 1,2,3. På samma sätt genererar uttrycket 3..-1..1
sekvensen 3,2,1. Du kan också använda intervall för att skapa en ny matris från en befintlig genom att segmentera, till exempel:
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]
Du kan inte definiera ett oändligt intervall i Q#. Värdena för start och slut måste alltid anges. Det enda undantaget är när du använder en Range
för att segmentera en matris. I så fall kan start- eller slutvärdena för intervallet rimligen härledas av kompilatorn.
I föregående matrissnittsexempel är det rimligt att kompilatorn antar att den avsedda intervallsluten ska vara indexet för det sista objektet i matrisen om stegstorleken är positiv. Om stegstorleken är negativ bör intervallslutet sannolikt vara indexet för det första objektet i matrisen. 0
Den omvända rymmer för början av intervallet.
Sammanfattnings skull, om du utelämnar intervallets startvärde, det härledda startvärdet
- är noll om inget steg har angetts eller om det angivna steget är positivt.
- är längden på matrisen minus en om det angivna steget är negativt.
Om du utelämnar intervallets slutvärde, det härledda slutvärdet
- är längden på matrisen minus ett om inget steg har angetts eller om det angivna steget är positivt.
- är noll om det angivna steget är negativt.
Q# tillåter därför användning av öppna intervall i matrissliceringsuttryck, till exempel:
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];
Eftersom bestämningen av om intervallsteget är positivt eller negativt inträffar vid körning infogar kompilatorn ett lämpligt uttryck som ska utvärderas vid körning. För utelämnade slutvärden är step < 0 ? 0 | Length(arr)-1
det infogade uttrycket , och för utelämnade startvärden är step < 0 ? Length(arr)-1 | 0
det , där step
är uttrycket som anges för intervallsteget eller 1
om inget steg har angetts.