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
- 1. Jaka jest różnica między stałymi makr i stałymi zmiennymi w C?
- 2. Różnica między niezmiennymi i skutecznie niezmiennymi obiektami?
- 3. jaka jest różnica między: %% a% zmiennymi% zmiennych?
- 4. Jaka jest różnica między zmiennymi środowiskowymi "USER" i "USERNAME"?
- 5. Jaka jest różnica między literałem a zmiennymi w Pythonie?
- 6. Jaka jest różnica między zmiennymi klasowymi różnych typów?
- 7. Jaka jest różnica między? : i ||
- 8. Jaka jest różnica między $ i $$?
- 9. Jaka jest różnica między = i: = w mysql?
- 10. Jaka jest różnica między! = I =! w Javie?
- 11. Jaka jest różnica między 'i "w PHP
- 12. Jaka jest różnica między! i !! w yaml?
- 13. jaka jest różnica między @ i @@ w module?
- 14. Jaka jest różnica między * i. * W Matlab?
- 15. Jaka jest różnica między | i || w MATLAB?
- 16. Jaka jest różnica między * i * | * w CSS?
- 17. GetType używany w PowerShell, różnica między zmiennymi
- 18. Różnica między obiektami podlegającymi modyfikacji a obiektami niezmiennymi
- 19. Jaka jest różnica między `&` a `ref`?
- 20. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 21. Jaka jest różnica między asersem i static_assert?
- 22. Jaka jest różnica między PropertyChangeListener i VetoableChangeListener?
- 23. Jaka jest różnica między Ja i Ja?
- 24. Jaka jest różnica między ATL i WTL?
- 25. Jaka jest różnica między FontMetrics.stringWidth() i FontMetrics.getStringBounds()?
- 26. Jaka jest różnica między "CompletionStage" i "CompletableFuture"?
- 27. Jaka jest różnica między CellClick i CellMouseClick?
- 28. Jaka jest różnica między ObjectResult i JsonResult
- 29. Jaka jest różnica między ssize_t i ptrdiff_t?
- 30. Jaka jest różnica między fn i fn *?