В чем разница между неизменяемыми и константными переменными в Rust?

Я узнал, что если переменная явно не объявлена ​​mutable с помощью mut, она становится неизменной (ее нельзя изменить после объявления). Тогда почему у нас есть ключевое слово const в 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

История немного длиннее.