Я узнал, что если переменная явно не объявлена mutable с помощью mut
, она становится неизменной (ее нельзя изменить после объявления). Тогда почему у нас есть ключевое слово const
в Rust? Разве они не такие? Если нет, то как они отличаются?
В чем разница между неизменяемыми и константными переменными в Rust?
Ответ 1
const
, в Rust, является коротким для константы и связан с оценкой времени компиляции. Он показывает:
- при объявлении констант:
const FOO: usize = 3;
- при объявлении функций оценки времени компиляции:
const fn foo() -> &'static str
Эти типы значений могут использоваться как общие параметры: [u8; FOO]
. Пока это ограничено размером массива, но есть разговоры, планы и надеемся расширить его в будущем.
В отличие от этого, привязка let
относится к расчетному значению времени выполнения.
Обратите внимание, что, несмотря на то, что mut
используется, потому что концепция изменчивости хорошо известна, на самом деле здесь находится Rust. &T
и &mut T
относятся к сглаживанию, а не к изменчивости:
-
&T
: общая ссылка -
&mut T
: уникальная ссылка
В частности, некоторые типы имеют внутреннюю изменчивость и могут быть изменены через &T
(общие ссылки): Cell
, RefCell
, Mutex
и т.д.
Примечание: существует альтернативное использование mut
и const
с необработанными указателями (*mut T
и *const T
), которые здесь не обсуждаются.
Ответ 2
const
не для переменных; он для постоянных значений, которые нигде не могут быть сохранены; они фактически являются псевдонимом для буквального значения.
Non-mut
let
объявляет фактическую переменную, которая создается во время выполнения, может быть перемещена (и уже недоступна) и даже имеет внутреннюю изменчивость (если она содержит членов Cell
, например) в некоторых случаев.
Ответ 3
Константы не могут быть переопределены:
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
Ответ 4
const
- для констант времени компиляции со всем, что влечет за собой. Например, вы можете создать массив фиксированного размера, размер которого равен const
, но вы не можете сделать это с привязкой let
. Конечно, это также означает, что вы можете передавать гораздо больше вещей в привязку let
, чем в const
.
Ответ 5
Кроме того, мы не можем создавать глобальные элементы с помощью let, но это возможно с помощью const. Вот пример.
const LENGTH:usize = 4;
fn main() {
let arr:[i32; LENGTH] = [10,20,30,40];
for i in 0..LENGTH{
println!("{}", arr[i])
}
}
для получения дополнительной информации об использовании const, static и let:
const
и static
История немного длиннее.