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