名前空間
最上位レベルでは、Q# プログラムは一連の名前空間から成り立っています。 コメントを別にすると、Q# プログラム内の最上位レベル要素は名前空間のみであり、他のすべての要素は名前空間内に存在する必要があります。 各ファイルには 0 個以上の名前空間が含まれ、各名前空間は複数のファイルにまたがっている可能性があります。 Q# では、入れ子になった名前空間はサポートされません。
名前空間ブロックは、キーワード namespace
、それに続く名前空間名、さらには中かっこ { }
内のブロックのコンテンツから成り立っています。
名前空間名は、ドット (.
) によって区切られた 1 つ以上の有効な記号のシーケンスから成り立っています。
読みやすくするために、名前空間名にはドットを含めることができますが、Q# では、名前空間への相対参照はサポートされません。 たとえば、2 つの名前空間 Foo
と Foo.Bar
は無関係であり、階層の概念もありません。 具体的には、Foo.Bar
で定義された関数 Baz
の場合、Foo
を開くことも、その後で Bar.Baz
を介してその関数にアクセスすることもできません。
名前空間ブロックには、操作、関数、型の宣言だけでなく、オープン ディレクティブを含めることもできます。 これらは、任意の順序で出現でき、既定では再帰的です。つまり、任意の順序で宣言して使用でき、それ自体を呼び出すことができます。その使用場所の前に型または callable を宣言する必要はありません。
open ディレクティブ
既定では、同じ名前空間内で宣言されたすべてのものに、追加の修飾なしでアクセスできます。 ただし、別の名前空間内の宣言を使用するには、所属先の名前空間の名前を使用してそれらの名前を修飾するか、それらが使用される前にその名前空間を開く必要があります。次に例を示します。
namespace Microsoft.Quantum.Samples {
open Microsoft.Quantum.Arithmetic;
open Microsoft.Quantum.Arrays as Array;
// ...
}
この例では、open
ディレクティブを使用して、Microsoft.Quantum.Artithmetic 名前空間で宣言されたすべての型と callable をインポートします。 その後、これらは、非修飾名によって参照できます。ただし、その名前が名前空間ブロック内または別の開かれた名前空間内の宣言と競合している場合を除きます。
完全な名前を入力しなくても、特定の要素の所属先を識別できるようにするために、特定の名前空間の代替名 (エイリアス) を定義できます。これは、通常は短縮形です。 この場合、その名前空間で宣言されたすべての型と callable は、定義された短い名前を代わりに使用して修飾できます。
前の例では、Microsoft.Quantum.Arrays
名前空間がこれに該当します。 たとえば、Microsoft.Quantum.Arrays
で宣言された関数 IndexRange
は、その名前空間ブロック内で Array.IndexRange
を介して使用できます。
名前空間を開く場合でも、エイリアスを定義する場合でも、 open
ディレクティブは、そのファイル内の名前空間部分全体でのみ有効です。