Dowiedziałem się, że jeśli zmienna nie jest jawnie zadeklarowana jako zmienna przy użyciu mut
, staje się niezmienna (nie może być zmieniona po deklaracji). Dlaczego więc mamy słowo kluczowe const
w Rust? Czyż nie są one takie same? Jeśli nie, jak się różnią?Jaka jest różnica między zmiennymi niezmiennymi i stałymi w Rust?
Odpowiedz
const
w Rust, jest skrótem od stałej i jest związana z oceną kompilacji. Pojawia się:
- podczas deklarowania stałych:
const FOO: usize = 3;
- podczas deklarowania czasu kompilacji funkcji możliwych do oceny:
const fn foo() -> &'static str
Takie wartości mogą być używane jako parametry ogólne: [u8; FOO]
. Na razie jest to ograniczone do rozmiaru tablicy, ale jest rozmowa, plany i nadzieja na jej dalsze rozszerzenie w przyszłości.
Z kolei powiązanie let
dotyczy obliczonej wartości czasu wykonywania.
Należy pamiętać, że pomimo że pojęcie zmienności jest dobrze znane, Rust rzeczywiście leży tutaj. &T
i &mut T
są o aliasingu, nie zmienność:
&T
: wspólne odniesienie&mut T
: wyjątkowy odniesienie
Przede wszystkim, niektóre rodzaje wyposażone wewnętrzną zmienność i może być zmutowany poprzez &T
(wspólne odniesienia): Cell
, RefCell
, Mutex
, itp.
Uwaga: istnieje alternatywa wykorzystanie mut
i const
z surowych wskaźników (*mut T
i *const T
), który nie jest tu mowa.
const
jest dla stałych kompilacyjnych ze wszystkim, co pociąga za sobą. Na przykład można utworzyć macierz o stałej wielkości, której rozmiar to const
, ale nie można tego zrobić z powiązaniem let
. Oczywiście oznacza to również, że możesz włożyć o wiele więcej rzeczy w wiązanie let
niż w const
.
const
nie jest dla zmiennych; to dla stałych wartości, które nie mogą być nigdzie przechowywane; są one faktycznie pseudonimem o dosłowności.
Nie- mut
let
deklaruje rzeczywista zmienna, która jest tworzona w czasie wykonywania, mogą być przemieszczane (i nie jest już dostępny), a nawet mieć wewnętrzną zmienność (jeśli zawiera Cell
członków, na przykład) w niektórych przypadkach.
Stałe nie mogą być na nowo:
let x = 10u32;
const Y:u32 = 20u32;
let x = 11u32;
//error: duplicate definition of value `Y` [E0428]
//const Y:u32 = 21u32;
println!("x={} Y={}",x,Y); //x=11 Y=20