Ad alanları (F #)
Bir ad alanı, bir F # program öğesi gruplandırmasına bir ad iliştirmenizi sağlayarak kodu ilgili işlevlerin alanlarıyla düzenlemenizi sağlar. Ad alanları genellikle F # dosyalarındaki en üst düzey öğelerdir.
Syntax
namespace [rec] [parent-namespaces.]identifier
Açıklamalar
Bir ad alanına kod koymak istiyorsanız, dosyadaki ilk bildirim ad alanını bildirmelidir. Dosyanın tamamı daha sonra başka bir ad alanı bildirimi mevcut olmadığından, bu dosyanın içeriği ad alanının bir parçası haline gelir. Bu durumda, sonraki ad alanı bildirimi ilk ad alanı içinde olduğu Düşünülene kadar tüm kod yukarı.
Ad alanları doğrudan değer ve işlevleri içeremez. Bunun yerine, değerler ve işlevler modüllerde yer almalıdır ve modüller ad alanlarına dahil edilir. Ad alanlarında türler, modüller bulunabilir.
XML belge açıklamaları bir ad alanı üzerinde bildirilemez, ancak bunlar yok sayılır. Derleyici yönergeleri Ayrıca bir ad alanı üzerinde de belirtilebilir.
Ad alanları, ad alanı anahtar sözcüğüyle açıkça veya bir modül bildirilirken örtük olarak bildirilemez. Bir ad alanını açıkça bildirmek için, ad alanı adını izleyen namespace anahtar sözcüğünü kullanın. Aşağıdaki örnek, bir Widgets türü ve bu ad alanına dahil olan bir modül içeren bir ad alanı bildiren bir kod dosyası gösterir.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Dosyanın tüm içeriği bir modülde ise, module anahtar sözcüğü kullanarak ve tam modül adında yeni ad alanı adını sağlayarak ad alanlarını örtülü olarak da bildirebilirsiniz. Aşağıdaki örnek, bir işlevi içeren bir ad alanı ve bir modül bildiren bir kod dosyası gösterir Widgets WidgetsModule .
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
Aşağıdaki kod, önceki koda eşdeğerdir, ancak modül yerel bir modül bildirimidir. Bu durumda, ad alanı kendi satırında görünmelidir.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Aynı dosyada bir veya daha fazla ad alanında birden fazla modül gerekliyse, yerel modül bildirimleri kullanmanız gerekir. Yerel modül bildirimleri kullandığınızda, modül bildirimlerinde nitelikli ad alanını kullanamazsınız. Aşağıdaki kod, bir ad alanı bildirimi ve iki yerel modül bildirimi olan bir dosyayı gösterir. Bu durumda, modüller doğrudan ad alanında yer alır; dosya ile aynı ada sahip örtük olarak oluşturulmuş bir modül yoktur. Dosyadaki bir bağlama gibi başka herhangi bir kod do ad alanında yer alan, iç modüllerde değil, modül üyesini widgetFunction modül adını kullanarak nitelemeniz gerekir.
namespace Widgets
module WidgetModule1 =
let widgetFunction x y =
printfn "Module1 %A %A" x y
module WidgetModule2 =
let widgetFunction x y =
printfn "Module2 %A %A" x y
module useWidgets =
do
WidgetModule1.widgetFunction 10 20
WidgetModule2.widgetFunction 5 6
Bu örneğin çıktısı aşağıdaki gibidir.
Module1 10 20
Module2 5 6
Daha fazla bilgi için bkz. modüller.
İç içe geçmiş ad alanları
İç içe bir ad alanı oluşturduğunuzda, tam olarak nitelemeniz gerekir. Aksi takdirde, yeni bir üst düzey ad alanı oluşturursunuz. Ad alanı bildirimlerinde girintileme yok sayılır.
Aşağıdaki örnek, iç içe bir ad alanının nasıl bildirilemeyeceğini gösterir.
namespace Outer
// Full name: Outer.MyClass
type MyClass() =
member this.X(x) = x + 1
// Fully qualify any nested namespaces.
namespace Outer.Inner
// Full name: Outer.Inner.MyClass
type MyClass() =
member this.Prop1 = "X"
Dosyalarda ve derlemelerde ad alanları
Ad alanları, tek bir projede veya derlemede birden çok dosyayı kapsayabilir. Ad alanı parçası , bir dosyada bulunan bir ad alanının parçasını açıklar. Ad alanları birden fazla derlemeye de yayılabilir. örneğin, System ad alanı birçok derlemeyi kapsayan ve birçok iç içe ad alanı içeren .NET Framework tamamını içerir.
Genel ad alanı
global.Net en üst düzey ad alanına ad koymak için önceden tanımlanmış ad alanını kullanın.
namespace global
type SomeType() =
member this.SomeMember = 0
Ayrıca, üst düzey .NET ad alanına başvurmak için genel ' i de kullanabilirsiniz. Örneğin, diğer ad alanları ile ad çakışmalarını çözmek için.
global.System.Console.WriteLine("Hello World!")
Özyinelemeli ad alanları
Ayrıca, içerilen tüm kodun birbirini karşılıklı olarak özyinelemeli olmasını sağlamak için ad alanları özyinelemeli olarak da bildirilemez. Bu, aracılığıyla yapılır namespace rec . Kullanımı, namespace rec ve modülleri arasında karşılıklı başvuru kodu yazamayacak bazı paıns 'leri hafifme edebilir. Aşağıda buna bir örnek verilmiştir:
namespace rec MutualReferences
type Orientation = Up | Down
type PeelState = Peeled | Unpeeled
// This exception depends on the type below.
exception DontSqueezeTheBananaException of Banana
type Banana(orientation : Orientation) =
member val IsPeeled = false with get, set
member val Orientation = orientation with get, set
member val Sides: PeelState list = [ Unpeeled; Unpeeled; Unpeeled; Unpeeled] with get, set
member self.Peel() = BananaHelpers.peel self // Note the dependency on the BananaHelpers module.
member self.SqueezeJuiceOut() = raise (DontSqueezeTheBananaException self) // This member depends on the exception above.
module BananaHelpers =
let peel (b: Banana) =
let flip (banana: Banana) =
match banana.Orientation with
| Up ->
banana.Orientation <- Down
banana
| Down -> banana
let peelSides (banana: Banana) =
banana.Sides
|> List.map (function
| Unpeeled -> Peeled
| Peeled -> Peeled)
match b.Orientation with
| Up -> b |> flip |> peelSides
| Down -> b |> peelSides
Özel durumun DontSqueezeTheBananaException ve sınıfın her Banana ikisi de birbirine başvurmadığını unutmayın. Ayrıca, modülü BananaHelpers ve sınıfı Banana birbirini da ifade eder. recAnahtar sözcüğü ad alanından kaldırdıysanız, bu, F # içinde ifade etmek mümkün değildir MutualReferences .
Bu özellik, üst düzey modülleriçin de kullanılabilir.