Поделиться через


Объявления импорта: ключевое слово open (F#)

Объявление импорта указывает модуль или пространство имен, на элементы которого можно ссылаться без использования полного имени.

open module-or-namespace-name

Заметки

Использование полного имени пространства имен или пути модуля во всех ссылках на код может затруднить написание, чтение и поддержку кода. Вместо этого можно использовать ключевое слово open для наиболее часто используемых модулей и пространств имен, чтобы в ссылках на члены этих модулей и пространств имен можно было использовать их краткие имена вместо полных. Это ключевое слово аналогично словам using в C#, using namespace в Visual C++ и Imports в Visual Basic.

Указанный модуль или пространство имен должно находиться либо в том же проекте, либо в проекте или сборке, указанной ссылкой. В противном случае можно добавить ссылку на проект или использовать параметр командной строки -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 означает Seq.empty, несмотря на то что элемент empty имеется как в модуле List, так и в модуле Seq.

open List
open Seq
printfn "%A" empty

Таким образом, необходимо соблюдать осторожность при открытии модулей и пространств имен, таких как List и Seq, где содержатся элементы с одинаковыми именами. Иногда в таких случаях имеет смысл использовать полные имена. Следует избегать ситуаций, в которых поведение кода зависит от очередности объявлений импорта.

Пространства имен, открываемые по умолчанию

Некоторые пространства имен используются в коде F# настолько часто, что они открываются автоматически, без необходимости явно указывать объявление импорта. В следующей таблице приведены пространства имен, открываемые по умолчанию.

Пространство имен

Описание

Microsoft.FSharp.Core

Содержит определения базовых типов F# для встроенных типов, таких как int и float.

Microsoft.FSharp.Core.Operators

Содержит базовые арифметические операции, такие как + и *.

Microsoft.FSharp.Collections

Содержит неизменяемые классы коллекций, таких как List и Array.

Microsoft.FSharp.Control

Содержит типы для конструкций управления, таких как отложенная оценка и асинхронные рабочие процессы.

Microsoft.FSharp.Text

Содержит функции для форматирования ввода/вывода, такие как printf.

Атрибут AutoOpen

К сборке можно применить атрибут AutoOpen, если требуется автоматически открывать пространство имен или модуль при указании ссылки на это сборку. Также можно применить атрибут AutoOpen к модулю, чтобы автоматически открывать его при открытии родительского модуля или пространства имен. Дополнительные сведения см. в разделе Класс Core.AutoOpenAttribute (F#).

См. также

Ссылки

Пространства имен (F#)

Модули (F#)

Другие ресурсы

Справочник по языку F#