關係型和省略的表達式
內容表達式是只在特定內容中有效的表達式,例如在 copy-and-update 運算式中使用專案名稱,而不需要限定它們。
在編譯程式可以推斷和自動插入表達式時,可以省略表達式,例如,在 evaluate-and-reassign 語句的情況下。
開放式範圍是另一個適用於內容和省略表達式的範例。 它們只在特定內容中有效,編譯程式會藉由推斷適當的界限,在編譯期間將它們轉譯成一般 Range
表達式。
類型的 Range
值會產生一連串的整數,由開始值、步驟值(選擇性)和結束值指定。 例如, Range
常值表達式 1..3
會產生序列 1,2,3。 同樣地,表達式 3..-1..1
會產生序列 3,2,1。 您也可以使用範圍,透過切割從現有的數位建立新的數位,例如:
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]
您無法在 中 Q#定義無限範圍;開始和結束值一律需要指定。 唯一的例外狀況是當您使用 Range
來配量陣列時。 在此情況下,編譯程式可以合理推斷範圍的開始或結束值。
在先前的陣列配量範例中,編譯程式應該假設預期的範圍結尾應該是陣列中最後一個專案的索引,如果步驟大小為正數。 如果步驟大小為負數,則範圍結尾可能是陣列中第一個專案的索引。 0
相反的會保留範圍的開頭。
總結來說,如果您省略範圍開始值,推斷的起始值
- 如果未指定任何步驟,或指定的步驟為正數,則為零。
- 如果指定的步驟為負數,則為數位的長度減一。
如果您省略範圍結束值,推斷的結束值
- 如果未指定任何步驟或指定的步驟為正數,則為數位減去的長度。
- 如果指定的步驟為負數,則為零。
Q# 因此允許在數位配量運算式中使用開放式範圍,例如:
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];
由於判斷範圍步驟在運行時間是正數還是負數,編譯程式會插入將在運行時間評估的適當表達式。 針對省略的結束值,插入的表達式為 step < 0 ? 0 | Length(arr)-1
,而針對省略的起始值為 step < 0 ? Length(arr)-1 | 0
,其中 step
是指定範圍步驟的表達式,如果未 1
指定任何步驟,則為 。