項目アクセス
Q# は、配列とユーザー定義型の項目アクセスをサポートしています。 どちらの場合も、アクセスは読み取り専用です。つまり値を変更するためには、コピーと更新の式を使用して必ず新しいインスタンスを作成する必要があります。
配列項目のアクセスと配列のスライシング
配列式、そして Int
型または Range
型の式から、[
と ]
から成る配列項目アクセス演算子を使用して新しい式を作成できます。
角かっこ内の式が Int
型である場合、そのインデックス位置にある配列項目が新しい式に格納されます。
たとえば、arr
が Double[]
型で 5 つ以上の項目を含んでいる場合、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# における配列はすべて 0 から始まります。つまり、配列 arr
の最初の要素は必ず arr[0]
になります。
スライシングに使用されるインデックスが配列の境界を越えている場合、たとえば、ゼロより小さかったり配列の長さ以上であったりした場合、実行時に例外がスローされます。
ユーザー定義型の項目アクセス
(名前付き項目または匿名項目を 1 つまたは複数含んだカスタム型を定義する方法について詳しくは、「型宣言」を参照してください)。
含まれている項目には、名前または分解によってアクセスできます。これは、操作または関数の実装の一部として使用できる次のステートメントで示されています。
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;
}
名前付き項目には、その名前または分解によってアクセスできますが、匿名の項目には、後者でしかアクセスできません。 分解は含まれるすべての項目に依存するため、型が定義されているコンパイル単位の外部でこれらの項目にアクセスする必要がある場合、匿名アイテムの使用はお勧めしません。
分解によるアクセスでは、アンラップ演算子 (!
) が使用されます。 アンラップ演算子は、格納されているすべての項目のタプルを返します。このときタプルの形状は、宣言で定義された形状と一致し、単一項目のタプルは項目そのものと等しくなります (こちらのセクションを参照)。
たとえば、次のように定義された Nested
型の値 nested
があるとします。
newtype Nested = (Double, (ItemName : Int, String));
この場合、nested!
式からは、(Double, (Int, String))
型の値が返されます。
!
演算子の優先順位は、2 つの項目アクセス演算子よりも低く、かつ他のすべての演算子よりも高くなります。 優先順位の完全な一覧については、「優先順位と結合性」を参照してください。