I learned that if a variable is not explicitly declared mutable using mut
, it becomes immutable (it cannot be changed after declaration). Then why do we have the const
keyword in Rust? Aren't they same? If not, how do they differ?
const
, in Rust, is short for constant and is related to compile-time evaluation. It shows up:
const FOO: usize = 3;
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 referenceMost 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.