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 function1
klasy , 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.