インポート宣言: open キーワード (F#)
インポート宣言では、完全修飾名を使用せずに要素を参照できるモジュールまたは名前空間を指定します。
open module-or-namespace-name
解説
コードを参照するたびに完全修飾名前空間や完全修飾モジュール パスを使用すると、コードの記述や読み取りが難しくなり、保守しにくいコードが作成される可能性があります。 代わりに、頻繁に使用されるモジュールや名前空間に対して open キーワードを使用すると、そのモジュールや名前空間のメンバーを参照する際に、完全修飾名の代わりに短縮形の名前を使用できます。 このキーワードは、C# の using キーワード、Visual C++ の using namespace、および Visual Basic の Imports に似ています。
指定するモジュールまたは名前空間は、同一プロジェクト内、または参照先プロジェクトまたはアセンブリ内に存在する必要があります。 この条件が満たされない場合は、プロジェクトに対して参照を追加するか、-reference コマンド ライン オプション (またはその省略形の -r) を使用できます。- 詳細については、「コンパイラ オプション (F#)」を参照してください。
インポート宣言を使用すると、この宣言の後に続くコードでその名前を使用できるようになります。使用できる範囲は、宣言を囲んでいる名前空間、モジュール、またはファイルの末尾までです。
複数のインポート宣言を使用する場合は、それらを別々の行に記述する必要があります。
次のコードは、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 "%A" empty
したがって、同じ名前のメンバーを持つ List や Seq のようなモジュールまたは名前空間を開く場合には注意してください。代わりに、修飾名の使用を検討してください。 コードがインポート宣言の順序に依存するという状況を防ぐ必要があります。
既定で開いている名前空間
一部の名前空間は F# コードで非常に頻繁に使用されるため、暗黙で開かれます。明示的にインポート宣言する必要はありません。 既定で開かれる名前空間を次の表に示します。
名前空間 |
説明 |
---|---|
Microsoft.FSharp.Core |
組み込み型 (int や float など) に対する基本的な F# の型定義が含まれます。 |
Microsoft.FSharp.Core.Operators |
基本的な算術演算子 (+ や * など) が含まれます。 |
Microsoft.FSharp.Collections |
変更できないコレクション クラス (List や Array など) が含まれます。 |
Microsoft.FSharp.Control |
コントロール構成要素 (遅延評価や非同期ワークフローなど) の型が含まれます。 |
Microsoft.FSharp.Text |
書式設定された I/O の関数 (printf 関数など) が含まれます。 |
AutoOpen 属性
アセンブリを参照するときに名前空間またはモジュールを自動的に開く場合には、AutoOpen 属性をアセンブリに適用できます。 親モジュールまたは親名前空間が開いている場合は、AutoOpen 属性をモジュールに適用して、そのモジュールを自動的に開くこともできます。 詳細については、「Core.AutoOpenAttribute クラス (F#)」を参照してください。