最近在学习 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);