インポート宣言: open
キーワード
"インポート宣言" によって、完全修飾名を使用せずに参照できる要素が含まれるモジュールまたは名前空間を指定します。
構文
open module-or-namespace-name
open type type-name
解説
完全修飾名前空間またはモジュール パスを毎回使用してコードを参照すると、書き込み、読み取り、および保守が難しいコードが作成される可能性があります。 代わりに、頻繁に使用されるモジュールと名前空間に open
キーワードを使用すると、そのモジュールまたは名前空間のメンバーを参照するときに、完全修飾名の代わりに短い形式の名前を使用することができます。 このキーワードは、C# の using
キーワード、Visual C++ の using namespace
、Visual Basic の Imports
に似ています。
指定されたモジュールまたは名前空間は、同じプロジェクト内か、参照されるプロジェクトまたはアセンブリ内に存在する必要があります。 そうでない場合は、プロジェクトへの参照を追加するか、-reference
コマンド ライン オプション (またはその省略形、-r
) を使用することができます。 詳細については、「コンパイラ オプション」を参照してください。
インポート宣言により、宣言の後のコード内 (外側の名前空間、モジュール、またはファイルの末尾まで) で名前を使用できるようになります。
複数のインポート宣言を使用する場合は、それらが別々の行にある必要があります。
次のコードは、open
キーワードを使用してコードを簡略化する方法を示しています。
// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
let writer = new System.IO.StreamWriter(stream1)
writer.WriteLine(text)
// Open a .NET Framework namespace.
open System.IO
// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
let stream1 = new FileStream(filename, FileMode.Create)
let writer = new StreamWriter(stream1)
writer.WriteLine(text)
writeToFile2 "file1.txt" "Testing..."
複数の開いているモジュールまたは名前空間に同じ名前のものがあって、あいまいさが発生した場合、F# コンパイラによってエラーや警告は生成されません。 あいまいさが発生した場合、F# では、最近開いたモジュールまたは名前空間が優先されます。 たとえば、次のコードでは、empty
が List
と Seq
の両方のモジュールにある場合でも、empty
は Seq.empty
を意味します。
open List
open Seq
printfn %"{empty}"
したがって、同じ名前を持つメンバーが含まれているモジュールまたは名前空間 (List
や Seq
など) を開く場合は注意が必要です。代わりに、修飾名の使用を検討してください。 コードがインポート宣言の順序に依存する状況は避ける必要があります。
オープン型宣言
F# では、次のように型に対する open
がサポートされます。
open type System.Math
PI
これにより、その型のアクセス可能なすべての静的フィールドとメンバーが公開されます。
また、F# で定義されたレコードと判別共用体の型に open
を使用して、静的メンバーを公開することもできます。 判別共用体の場合は、共用体ケースを公開することもできます。 これは、次のように、オープンするのが望ましくない可能性がある、モジュール内で宣言された型の共用体ケースにアクセスする場合に役立つ可能性があります。
module M =
type DU = A | B | C
let someOtherFunction x = x + 1
// Open only the type inside the module
open type M.DU
printfn "%A" A
global
指定子だけを使用してルート パスから開く
入れ子になったモジュール
module A =
module B =
...
を介して開くことができます
open A // opens A
open B // opens A.B
完全修飾モジュールまたは名前空間だけを開くには、以下のように、それらに global
指定子のプレフィックスを付けます。
open global.A // works
open global.B // this now fails
open global.A.B // works
既定でオープンされる名前空間
一部の名前空間は F# コードでよく使用されるため、明示的なインポート宣言を行う必要なしに暗黙的にオープンされます。 既定でオープンされる名前空間を次の表に示します。
名前空間 | 説明 |
---|---|
FSharp.Core |
int や float などの組み込み型の基本的な F# 型定義が含まれています。 |
FSharp.Core.Operators |
+ や * などの基本的な算術演算が含まれています。 |
FSharp.Collections |
List や Array などの変更できないコレクション クラスが含まれています。 |
FSharp.Control |
遅延評価や非同期式などのコントロール コンストラクトの型が含まれています。 |
FSharp.Text |
printf 関数など、書式設定された IO 用の関数が含まれています。 |
AutoOpen 属性
アセンブリが参照されたときに名前空間またはモジュールを自動的にオープンする場合は、アセンブリに AutoOpen
属性を適用できます。 AutoOpen
属性をモジュールに適用して、親モジュールまたは名前空間がオープンされたときにそのモジュールを自動的にオープンすることもできます。 詳細については、AutoOpenAttribute に関するページを参照してください。
RequireQualifiedAccess 属性
一部のモジュール、レコード、または共用体型では、RequireQualifiedAccess
属性を指定できます。 これらのモジュール、レコード、または共用体の要素を参照する場合は、インポート宣言を含めるかどうかに関係なく、修飾名を使用する必要があります。 よく使用される名前を定義する型でこの属性を戦略的に使用すると、名前の競合を避けることができるため、ライブラリ内の変更に対するコードの回復性が向上します。 詳細については、RequireQualifiedAccessAttribute に関するページを参照してください。
関連項目
.NET