Menu

Wiązania let w Zero: nadawanie nazw wartościom

Jak działa let w Zero: deklarowanie lokalnych wiązań, wnioskowanie typów i jawne adnotacje oraz dlaczego Zero używa jednej formy wiązania zamiast kilku słów kluczowych.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Jeden sposób na nazwanie wartości

W Zero nadajesz wartości nazwę za pomocą let:

let answer = 42

To cała składnia. Nie ma var, const ani auto. Jedno słowo kluczowe do wiązań utrzymuje język małym: agenci i ludzie uczą się go raz i stosują wszędzie.

let wprowadza lokalne wiązanie w bieżącym zakresie. Po tej linii answer oznacza 42 aż do końca obejmującego bloku.

Wnioskowanie typów

Kompilator wnioskuje typ z prawej strony. Literał 42 ma domyślnie typ i32, więc answer jest typu i32. Literał "cześć" to tekst, więc:

let greeting = "cześć"

wiąże greeting z wartością tekstową. Jeśli wywołasz funkcję zwracającą Pair<i32, u8>, wiązanie ma typ Pair<i32, u8>:

let pair = makePair(40, 2_u8)

Nie musisz pisać typu przy każdym wiązaniu, co utrzymuje kod czytelnym.

Jawne adnotacje typów

Gdy chcesz udokumentować typ albo wymusić konkretny, bo wnioskowanie wybrałoby inny, zapisz typ po dwukropku:

let count: u8 = 10
let pair:  Pair<i32, u8> = makePair(40, 2_u8)

Adnotacje są też wskazówką dla kompilatora, gdy literał może mieć jeden z kilku typów. Literał 10 może być i32, i64, u8 i tak dalej; adnotacja go ustala.

Zobaczysz też sufiksy typów w literałach jako alternatywę dla adnotacji wiązania:

let small = 10_u8   // u8 dzięki sufiksowi literału
let big   = 10_i64  // i64 dzięki sufiksowi literału

Obie formy są poprawne; wybierz tę, która w danym miejscu lepiej wyraża zamiar.

Wiązania w praktyce

Przykład z formą wnioskowaną i jawną. Kliknij Run, aby go wypróbować:

point ma jawną adnotację, bo prawa strona to literał struktury. total jest wnioskowane: sum zadeklarowano jako zwracające i32, więc wiązanie też ma typ i32.

Zakres i przesłanianie

Wiązanie let obowiązuje od linii, w której je zadeklarowano, do końca obejmującego bloku. Zagnieżdżone bloki tworzą nowe zakresy:

pub fun main(world: World) -> Void raises {
    let value = 1
    if true {
        let value = 2   // przesłania zewnętrzne 'value' w tym bloku
        // tutaj value == 2
    }
    // znów poza if, value == 1
}

Wewnętrzne value nie zmienia zewnętrznego: to osobne wiązanie, które wychodzi z zakresu przy nawiasie zamykającym blok if. To ten sam model co w Ruście i językach z rodziny ML. Jest szczególnie przydatny, gdy chcesz przekształcać wartość w kolejnych krokach bez wymyślania nowych nazw dla każdego wyniku pośredniego.

Czego let nie robi

Kilka rzeczy znanych z innych języków, których let celowo nie obejmuje:

  • Deklaracje z samym typem. Nie ma formy let x: i32;, która wprowadza niezainicjowane wiązanie. Wiązanie musi mieć wartość w miejscu deklaracji.
  • Destrukturyzacja wzorców (na razie). Niektóre języki pozwalają napisać let (a, b) = pair. Zero jest z założenia małe i obecnie skupia się na zwykłych wiązaniach nazw: sprawdź w aktualnej dokumentacji, czy destrukturyzacja już się pojawiła.
  • Różne słowa kluczowe dla różnych czasów życia. Nie ma osobnych static, const, let mut ani wariantów o zakresie bloku lub funkcji. Jedno słowo kluczowe.

Jeśli przychodzisz z JavaScriptu, najbliższą analogią jest const: nazwa związana z wartością do końca bloku, z przesłanianiem w zakresach wewnętrznych. Jeśli przychodzisz z Rusta, let pełni tu tę samą rolę co let w Ruście, tylko bez jawnego słowa kluczowego mut.

Wzorzec: budowanie wartości krok po kroku

Wiązania sprawdzają się najlepiej, gdy chcesz zapisać obliczenie jako serię nazwanych kroków pośrednich. To dobre zarówno dla ludzi, którzy czytają kod, jak i dla agentów, które rozumują lokalnie o każdej linii:

Każda linia wprowadza jeden nowy fakt, z którego korzysta reszta funkcji. Kompilator nadal generuje zwarty kod: nazywanie wartości pośrednich nie ma kosztu w czasie działania.

Dalej: typy proste

let niewiele znaczy bez czegoś do związania. Następny artykuł omawia typy proste w Zero: szerokości liczb całkowitych, liczby zmiennoprzecinkowe, teksty oraz typy Void i Bool, które spotkasz najczęściej.

Najczęściej zadawane pytania

Jak zadeklarować zmienną w Zero?

Użyj let. Forma to let name = value dla typu wnioskowanego albo let name: Type = value, aby zapisać typ jawnie. Na przykład: let answer = 42 lub let answer: i32 = 42. Obie wiążą nazwę answer z wartością 42 w bieżącym zakresie.

Czy Zero wnioskuje typy wiązań let?

Tak. Jeśli napiszesz let total = sum(point), a sum zwraca i32, typ wiązania zostanie wywnioskowany jako i32. Nadal możesz dodać jawną adnotację, gdy chcesz udokumentować typ albo wymusić konkretny, na przykład let count: u8 = 10.

Czy wiązania let w Zero są mutowalne?

Zwykłe let wprowadza lokalne wiązanie do użycia w jego zakresie. Kwestia mutowalności w Zero przed wersją 1.0 wciąż się kształtuje: język stawia na jawne efekty i przewidywalną pamięć, więc wszystko, co zmienia stan przez wiązanie, musi to pokazywać. Dokładną składnię mutowalności w twojej wersji toolchaina sprawdź w aktualnej dokumentacji Zero.

Jaka jest różnica między let a const w Zero?

Zero używa let dla zwykłych lokalnych wiązań w ciałach funkcji. Nie udostępnia wielu słów kluczowych do wiązań, jak let/const/var w JavaScripcie: mała powierzchnia to świadoma decyzja projektowa. Stałe czasu kompilacji wyraża się zwykle przez system typów albo deklaracje najwyższego poziomu, a nie osobne słowo kluczowe.

Czy można ponownie zadeklarować wiązanie let w Zero?

Wiązania żyją w obejmującym je zakresie. Nowe let o tej samej nazwie w zagnieżdżonym zakresie to osobne wiązanie, które przesłania zewnętrzne na czas trwania wewnętrznego zakresu; po jego zakończeniu zewnętrzne wiązanie pozostaje nietknięte. To ten sam model, którego używają Rust i języki z rodziny ML.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ