MENU

Rust 中 const 和 let 的区别

• June 23, 2022 • Read: 2017 • Rust

最近在学习 rust,在学到 let 和 const 的时候产生了疑惑,既然在 rust 中 let 是声明一个不可变变量,而 const 是一个常量也是不可变的,那为什么在 rust中会有 const 这样一个看似多余的关键字呢?

在网上查询资料后,我发现他们的区别如下:

  • const 不允许与 mut 关键字一起使用,当然,这是显而易见的
  • 对于 const 来说必须声明类型,而对于 let 来说类型是可以省略的
  • const 声明常量只能使用一个常量表达式,而不能是函数调用结果或是在运行时才能确定的值,而 let 可以使用这些来进行声明赋值
  • const 可以在任意范围内(如函数体外)声明,而 let 只能在函数体中使用
  • const 常量不能够被覆盖,而 let 变量可以
  • const 常量没有模式推导功能,而 let 变量可以
  • const 常量在编译期会被优化,进行常量传播,直接对引用的地方进行替换,所以编译后常量的使用一般会变成立即数指令,而 let 变量则会是直接寻址或间接寻址,性能消耗多一点(但是性能差距可以微小到不计)
  • const 关键字可以作用在函数上,而 let 不行
  • const 的命名规则是 SCREAMING_SNAKE_CASE,而 let 的命名规则是 snake_case

const 和 let 的几种正确使用方法:

// 声明全局常量(函数体外)
const NUM: i32 = 1;

// 使用常量表达式声明常量
const NUM: i32 = 10 * 6 * 2;

// const 可以作用于函数上
const fn const_func() -> i32 {return 1;}

fn main() {
    // 声明局部常量(作用域限于main函数体内)
    const INNER_NUM: i32 = 1;

    // let 可以不指定类型
    let a = 1;

    // let 变量可以被覆盖
    let a = 2;

    // let 也可以指定类型
    let b: i32 = 1;

    // let 可以和 mut 关键字一同使用声明可变变量
    let mut c = 1;

    // let 有模式推导功能
    let (d, e) = (1, 2);
}

const 和 let 的几种错误使用方法:

// const 未指定类型
const NUM = 1;

// const 不能和 mut 关键词一同使用
const mut NUM_MUT: i32 = 1;

// let 不能在函数体外使用
let a = 1;

// const 声明后不可被覆盖
const i: i32 = 1;
const i: i32 = 2;

// const 不能使用函数调用结果或是在运行时才能确定的值进行赋值
fn func() -> i32 { return 1; }
const a: i32 = func();

// const 没有模式推导功能
const (b, c): (i32, i32) = (1, 2);