項目存取
Q# 支援陣列項目的陣列存取,以及使用者定義型別中的項目。 在這兩種情況下,存取權是唯讀的;如果沒有使用 copy-and-update 運算式建立新的實例,就無法變更值。
陣列專案存取和陣列配量
指定陣列運算式和類型 Int
或 Range
的運算式時,可能會使用由 [
和 ]
所組成的陣列項目存取運算子來形成新的運算式。
如果括弧內的表達式的類型為 Int
,則新運算式會包含該索引處的陣列專案。
例如,如果 arr
為型 Double[]
別且包含五個或多個專案,則 arr[4]
為類型的 Double
表達式。
如果方括弧內的表達式的類型為 Range
,則新運算式會包含所指定 Range
索引之所有項目的陣列。
Range
如果 是空的,則產生的陣列是空的。
例如
let arr = [10, 11, 36, 49];
let ten = arr[0]; // contains the value 10
let odds = arr[1..2..4]; // contains the value [11, 49]
let reverse = arr[...-1...]; // contains the value [49, 36, 11, 10]
在範例的最後一行中,為了方便起見,已省略範圍的開始和結束值。 如需詳細資訊,請參閱 關係型表達式。
如果陣語表達式不是簡單的標識碼,則必須以括弧括住,才能擷取專案或配量。
例如,如果 arr1
和 arr2
都是整數陣列,則串連中的項目會以 (arr1 + arr2)[13]
表示。 如需詳細資訊,請參閱 優先順序和關聯性。
中的所有 Q# 陣列都是以零起始,也就是說,陣列 arr
的第一個專案一律 arr[0]
為 。
如果用於切割的索引或其中一個索引超出陣列界限,例如,如果小於零或大於或等於陣列的長度,則會在運行時間擲回例外狀況。
使用者定義類型的專案存取
(如需如何定義包含一或多個具名或匿名專案的自定義類型的詳細資訊,請參閱 類型宣告) 。
包含的專案可以透過其名稱或解構來存取,如下列語句所說明,這些語句可用來做為作業或函式實作的一部分:
let complex = Complex(1., 0.); // create a value of type Complex
let (re, _) = complex!; // item access via deconstruction
let im = complex::Imaginary; // item access via name
項目存取運算子 (::
) 會擷取命名項目,如下列範例所示:
newtype TwoStrings = (str1 : String, str2 : String);
operation LinkTwoStrings(str : TwoStrings) : String {
let s1 = str::str1;
let s2 = str::str2;
return s1 + s2;
}
雖然可以透過名稱或解構存取命名項目,但是匿名項目只能由後者存取。 由於解構依賴所有包含的專案,因此當這些專案必須在定義型別的編譯單位外部存取時,不建議使用匿名專案。
透過解構存取會利用解除包裝運算子 (!
)。 unwrap 運算符會傳回所有包含專案的元組,其中 Tuple 的形狀符合宣告中定義的元素,而單一專案 Tuple 相當於專案本身 (請參閱 本節) 。
例如,針對定義為下列類型的Nested
值nested
newtype Nested = (Double, (ItemName : Int, String));
運算式 nested!
會傳回類型 (Double, (Int, String))
的值。
!
運算子的優先順序低於兩個項目存取運算子,但優先順序高於任何其他運算子。 如需完整的優先順序清單,請參閱 優先順序和關聯性。