let — Powiązania

Powiązanie kojarzy identyfikator z wartością lub funkcją. Słowo kluczowe służy let do powiązania nazwy z wartością lub funkcją.

Składnia

// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression

Uwagi

Słowo let kluczowe jest używane w wyrażeniach powiązań do definiowania wartości lub wartości funkcji dla co najmniej jednej nazwy. Najprostsza forma let wyrażenia wiąże nazwę z prostą wartością w następujący sposób.

let i = 1

W przypadku oddzielenia wyrażenia od identyfikatora przy użyciu nowego wiersza należy wcięć każdy wiersz wyrażenia, tak jak w poniższym kodzie.

let someVeryLongIdentifier =
    // Note indentation below.
    3 * 4 + 5 * 6

Zamiast tylko nazwy można określić wzorzec zawierający nazwy, na przykład krotkę, jak pokazano w poniższym kodzie.

let i, j, k = (1, 2, 3)

Wyrażenie-treść jest wyrażeniem , w którym są używane nazwy. Wyrażenie treści jest wyświetlane we własnym wierszu, wcięcie w celu wyrównania dokładnie do pierwszego znaku w słowie let kluczowym:

let result =

    let i, j, k = (1, 2, 3)

    // Body expression:
    i + 2 * j + 3 * k

let Powiązanie może pojawić się na poziomie modułu, w definicji typu klasy lub w zakresach lokalnych, takich jak w definicji funkcji. let Powiązanie na najwyższym poziomie w module lub w typie klasy nie musi mieć wyrażenia treści, ale na innych poziomach zakresu jest wymagane wyrażenie treści. Nazwy powiązane można używać po punkcie definicji, ale nie w żadnym momencie przed let pojawieniem się powiązania, jak pokazano w poniższym kodzie.

// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x

Powiązania funkcji

Powiązania funkcji są zgodne z regułami powiązań wartości, z tą różnicą, że powiązania funkcji zawierają nazwę funkcji i parametry, jak pokazano w poniższym kodzie.

let function1 a = a + 1

Ogólnie rzecz biorąc, parametry to wzorce, takie jak wzorzec krotki:

let function2 (a, b) = a + b

Wyrażenie let powiązania oblicza wartość ostatniego wyrażenia. W związku z tym w poniższym przykładzie kodu wartość parametru result jest obliczana z 100 * function3 (1, 2)wartości , która daje wartość .300

let result =
    let function3 (a, b) = a + b
    100 * function3 (1, 2)

Aby uzyskać więcej informacji, zobacz Funkcje.

Adnotacje typu

Można określić typy parametrów, dołączając dwukropek (:), po którym następuje nazwa typu, wszystkie ujęte w nawiasy. Można również określić typ wartości zwracanej, dołączając dwukropek i typ po ostatnim parametrze. Adnotacje pełnego typu dla function1klasy , z liczbami całkowitymi jako typami parametrów, będą wyglądać następująco.

let function1 (a: int) : int = a + 1

Jeśli nie ma jawnych parametrów typu, wnioskowanie typu służy do określania typów parametrów funkcji. Może to obejmować automatyczne uogólnienie typu parametru, który ma być ogólny.

Aby uzyskać więcej informacji, zobacz Automatyczne uogólnienie i wnioskowanie typów.

Powiązania let w klasach

let Powiązanie może pojawić się w typie klasy, ale nie w strukturze lub typie rekordu. Aby użyć powiązania let w typie klasy, klasa musi mieć konstruktor podstawowy. Parametry konstruktora muszą być wyświetlane po nazwie typu w definicji klasy. let Powiązanie w typie klasy definiuje pola prywatne i składowe dla tego typu klasy, a wraz z powiązaniami do w typie tworzy kod dla konstruktora podstawowego dla typu. W poniższych przykładach kodu pokazano klasę MyClass z polami field1 prywatnymi i field2.

type MyClass(a) =
    let field1 = a
    let field2 = "text"
    do printfn "%d %s" field1 field2
    member this.F input =
        printfn "Field1 %d Field2 %s Input %A" field1 field2 input

Zakresy field1 i field2 są ograniczone do typu, w którym są deklarowane. Aby uzyskać więcej informacji, zobacz let Powiązania w klasach i klasach.

Parametry typu w powiązaniach let

let Powiązanie na poziomie modułu w typie lub w wyrażeniu obliczeniowym może mieć jawne parametry typu. Powiązanie let w wyrażeniu, takim jak w definicji funkcji, nie może mieć parametrów typu. Aby uzyskać więcej informacji, zobacz Ogólne.

Atrybuty zezwalania na powiązania

Atrybuty można stosować do powiązań najwyższego poziomu let w module, jak pokazano w poniższym kodzie.

[<Obsolete>]
let function1 x y = x + y

Zakres i ułatwienia dostępu powiązań let

Zakres jednostki zadeklarowanej za pomocą powiązania let jest ograniczony do części zakresu zawierającego (na przykład funkcji, modułu, pliku lub klasy) po pojawieniu się powiązania. W związku z tym można stwierdzić, że powiązanie let wprowadza nazwę do zakresu. W module wartość lub funkcja powiązana z let jest dostępna dla klientów modułu, o ile moduł jest dostępny, ponieważ powiązania let w module są kompilowane w funkcjach publicznych modułu. Z kolei powiązania let w klasie są prywatne dla klasy.

Zwykle funkcje w modułach muszą być kwalifikowane przez nazwę modułu, gdy jest używany przez kod klienta. Jeśli na przykład moduł Module1 ma funkcję function1, użytkownicy określą Module1.function1 , aby odwołać się do funkcji.

Użytkownicy modułu mogą używać deklaracji importu, aby udostępnić funkcje w tym module do użycia bez kwalifikowania przez nazwę modułu. W tym przykładzie użytkownicy modułu mogą w takim przypadku otworzyć moduł przy użyciu deklaracji open Module1 importu, a następnie odwołać się bezpośrednio.function1

module Module1 =
    let function1 x = x + 1.0

module Module2 =
    let function2 x =
        Module1.function1 x

open Module1

let function3 x =
    function1 x

Niektóre moduły mają atrybut RequireQualifiedAccess, co oznacza, że funkcje, które uwidaczniają, muszą być kwalifikowane przy użyciu nazwy modułu. Na przykład moduł listy języka F# ma ten atrybut.

Aby uzyskać więcej informacji na temat modułów i kontroli dostępu, zobacz Moduły i Kontrola dostępu.

Zobacz też