Авто открыть пространство имен в F # - PullRequest
3 голосов
/ 03 марта 2012

Привет хотел бы узнать, как заставить компилятор f # автоматически открывать пространство имен.

У меня есть

namespace XXX 

I have to add something here do(AutoOpen("XXX.YYY")) or something like that to make the XXX.YYY module to be opened when referencing the library from external projects.

[<AutoOpen>]
module YYY = 
    ....

Спасибо

Ответы [ 2 ]

11 голосов
/ 03 марта 2012

Чтобы открыть пространство имен / модуль, не открывая сначала его родителя, необходимо добавить атрибут на уровне сборки.Вы можете сделать это, добавив файл AssemblyInfo.fs в свой проект:

В случае следующего кода:

namespace Framework

module GlobalFunctions = 

  let Test () =
    10.

Например, вы добавили бы следующий код в AssemblyInfo.fs:

namespace Framework

[<assembly:AutoOpen("Framework.GlobalFunctions")>]

do()

И затем вы можете вызвать код из файла скрипта (.fsx) с помощью:

#r @"C:\PathToAssembly\Assembly.dll"

let result = Test ()

В результате:

--> Referenced 'C:\PathToAssembly\Assembly.dll'
val result : float = 10.0
3 голосов
/ 03 марта 2012

Атрибут AutoOpen может быть применен только к F # module, поэтому вы не сможете добавить его ко всему namespace. Однако, поскольку вы можете поместить все объявления F # внутри модуля, этого может быть достаточно для того, что вам нужно. Синтаксис:

[<AutoOpen>]
module MyGlobals =
  // Declarations in the module
  type Foo() = 
    member x.Bar = 10

Когда вы ссылаетесь на сборку, вы должны сразу увидеть Foo. Если объявление помещено в другое пространство имен (т. Е. MyLibrary), вам нужно добавить open MyLibrary, но MyGlobals будет доступно автоматически.

...