What is the difference between immutable and const variables in Rust?
Solution 1:
const
, in Rust, is short for constant and is related to compile-time evaluation. It shows up:
- when declaring constants:
const FOO: usize = 3;
- when declaring compile-time evaluable functions:
const fn foo() -> &'static str
These kinds of values can be used as generic parameters: [u8; FOO]
. For now this is limited to array size, but there is talk, plans, and hope to extend it further in the future.
By contrast, a let
binding is about a run-time computed value.
Note that despite mut
being used because the concept of mutability is well-known, Rust actually lies here. &T
and &mut T
are about aliasing, not mutability:
-
&T
: shared reference -
&mut T
: unique reference
Most notably, some types feature interior mutability and can be mutated via &T
(shared references): Cell
, RefCell
, Mutex
, etc.
Note: there is an alternative use of mut
and const
with raw pointers (*mut T
and *const T
) which is not discussed here.
Solution 2:
const
is not for variables; it's for constant values which may not be stored anywhere; they're effectively an alias for a literal value.
Non-mut
let
declares an actual variable which is created at runtime, can be moved (and no longer accessible), and even have interior mutability (if it contains Cell
members, for example) in some cases.