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 mutani 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.