インポート宣言:
インポート宣言は、完全修飾名を使用せずに参照できる要素を持つモジュールまたは名前空間を指定します。
構文
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# コードで頻繁に使用されるため、明示的なインポート宣言を必要とせずに暗黙的に開かれます。 次の表は、既定で開かれている名前空間を示しています。
Namespace | 説明 |
---|---|
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