Udostępnij za pośrednictwem


Moduły (F#)

W kontekście języka F# Moduł jest grupą F# kodu, takie jak wartości, typy i wartości funkcji, w programie F#.Grupowanie kodu w modułach pomaga zabezpieczyć kod powiązanych ze sobą i pomaga uniknąć konfliktów nazw w programie.

// Top-level module declaration. 
module [accessibility-modifier] [qualified-namespace.]module-name 
declarations
// Local module declaration.
module [accessibility-modifier] module-name =
   declarations

Uwagi

Moduł F# jest grupa F# konstrukcje kodu, takie jak typy wartości, wartości funkcji i kod w do wiązania.Są one zaimplementowane jako klasy runtime (CLR) języka wspólnego, która ma tylko elementy statyczne.Istnieją dwa typy deklaracje moduł, w zależności od tego, czy cały plik znajduje się w module: deklaracje moduł najwyższego poziomu i lokalne moduł.Deklaracja najwyższego poziomu moduł obejmuje cały plik w module.Deklaracja moduł najwyższego poziomu może mieć postać tylko pierwszego zgłoszenia w pliku.

W składni deklaracji modułu najwyższego poziomu, opcjonalna qualified-namespace jest sekwencją nazw zagnieżdżonych nazw, zawierający moduł.Kwalifikowanej nazw nie należy wcześniej zadeklarowana.

Nie masz wcięcie deklaracji w module najwyższego poziomu.Masz wciąć wszystkie deklaracje w modułach lokalnych.W deklaracji lokalnych modułu deklaracje, które są wcięte pod deklaracji modułu są częścią modułu.

Jeśli pliku kod rozpoczyna się od deklaracji modułu najwyższego poziomu lub deklaracja obszaru nazw, całej zawartości pliku, w tym wszystkie moduły lokalnych, staje się częścią niejawnie utworzony moduł najwyższego poziomu, który ma taką samą nazwę jak plik, bez rozszerzenia, z pierwszą literę przekonwertowany na wielkie litery.Na przykład rozważmy następujący plik.

// In the file program.fs. 
let x = 40

Ten plik będzie zestawiane tak, jakby to były pisane w ten sposób:

module Program
let x = 40

Jeśli masz wiele modułów w pliku, należy użyć deklaracji lokalnych modułu dla każdego modułu.Jeżeli zadeklarowano obejmujący obszar nazw, moduły te są częścią obejmujący obszar nazw.Jeśli nie jest zadeklarowany jako obejmujący obszar nazw, modułów stają się częścią niejawnie utworzony moduł najwyższego poziomu.Poniższy przykład kodu pokazuje pliku kodu, który zawiera wiele modułów.Kompilator niejawnie tworzy moduł najwyższego poziomu o nazwie Multiplemodules, i MyModule1 i MyModule2 są zagnieżdżone w tym module najwyższego poziomu.

// In the file multiplemodules.fs. 
// MyModule1 
module MyModule1 =
    // Indent all program elements within modules that are declared with an equal sign. 
    let module1Value = 100

    let module1Function x =
        x + 10

// MyModule2 
module MyModule2 =

    let module2Value = 121

    // Use a qualified name to access the function. 
    // from MyModule1. 
    let module2Function x =
        x * (MyModule1.module1Function module2Value)

Jeśli masz wiele plików w projekcie lub w jednej kompilacji lub buduje się biblioteki, musi zawierać deklaracji obszaru nazw lub moduł deklaracji na początku pliku.F# kompilator tylko Określa nazwę modułu niejawnie, kiedy istnieje tylko jeden plik w wierszu polecenia projektu lub kompilacji i tworzenia aplikacji.

The accessibility-modifier can be one of the following: public, private, internal.Aby uzyskać więcej informacji, zobacz Kontrola dostępu (F#).Wartością domyślną jest publiczny.

Odwoływanie się do kodu w modułach

Gdy odwołanie do funkcji, typy i wartości z innego modułu, można za pomocą nazwy kwalifikowanej lub Otwórz moduł.Jeśli za pomocą nazwy kwalifikowanej, należy określić obszary nazw, moduł i identyfikator dla elementu programu, który chcesz.W następujący sposób oddzielić każdą część kwalifikowaną ścieżkę z kropką (.).

Namespace1.Namespace2.ModuleName.Identifier

Można otworzyć modułu albo jeden lub więcej obszarów nazw, w celu uproszczenia kodu.Aby uzyskać więcej informacji na temat otwarcia przestrzeni nazw i modułów, zobacz Deklaracje importowania: open — Słowo kluczowe (F#).

Poniższy przykład kodu pokazuje moduł najwyższego poziomu, który zawiera cały kod do końca pliku.

module Arithmetic

let add x y =
    x + y

let sub x y =
    x - y

Albo użyć nazwy kwalifikowanej, lub jak pokazano w poniższych przykładach Otwórz moduł przed skorzystaniem z funkcji, użycia tego kodu z innego pliku w tym samym projekcie.

// Fully qualify the function name. 
let result1 = Arithmetic.add 5 9
// Open the module. 
open Arithmetic
let result2 = add 5 9

Moduły zagnieżdżone

Moduły mogą być zagnieżdżane.Wewnętrzne moduły muszą z wcięciem, jak wskazuje, że wewnętrzne moduły nie nowe moduły są deklaracje zewnętrznego modułu.Na przykład porównać poniższe dwa przykłady.Moduł Z jest wewnętrzny moduł, w poniższym kodzie.

module Y =
    let x = 1 

    module Z =
        let z = 5

Ale moduł Z jest elementem równorzędnym do modułu Y w poniższym kodzie.

module Y =
    let x = 1 

module Z =
    let z = 5

Moduł Z jest również moduł równorzędny w poniższym kodzie, ponieważ nie jest wcięty tak dalece jak innych deklaracji w module Y.

module Y =
        let x = 1

    module Z =
        let z = 5

Wreszcie zewnętrznego modułu ma nie deklaracje i natychmiast następuje deklaracja moduł innego, przyjęto, że nowe oświadczenie moduł być wewnętrzna modułu, ale kompilator będzie wyświetlane ostrzeżenie Jeśli drugi definicji modułu nie jest wcięty dalej niż pierwszy.

// This code produces a warning, but treats Z as a inner module. 
module Y =
module Z =
    let z = 5

Aby wyeliminować ostrzeżenie, tiret moduł wewnętrzny.

module Y =
    module Z =
        let z = 5

Jeśli chcesz, aby cały kod w pliku w pojedynczy moduł zewnętrznych i chcesz wewnętrzne moduły, zewnętrznego modułu nie wymaga znak równości i deklaracje, w tym wszelkich deklaracji moduł wewnętrzne, które będą go w zewnętrznym module nie muszą być wcięty.Deklaracje wewnątrz deklaracji moduł wewnętrzny musi być wcięty.Poniższy kod przedstawia tę sprawę.

// The top-level module declaration can be omitted if the file is named 
// TopLevel.fs or topLevel.fs, and the file is the only file in an 
// application. 
module TopLevel

let topLevelX = 5

module Inner1 =
    let inner1X = 1
module Inner2 =
    let inner2X = 5

Zobacz też

Informacje

Przestrzenie nazw (F#)

Inne zasoby

Materiały referencyjne dotyczące języka F#