【一起学rust | 基础篇】变量

【一起学rust | 基础篇】变量
本篇是我的 Rust 学习笔记第一篇,主要聊聊「变量与数据类型」中的变量部分。内容非常基础但很重要,适合刚入门 Rust 的同学一起看。让我们轻松踏入 Rust 的世界,开启安全又有趣的编程之旅吧!
变量
rust变量设计遵循“安全优先”原则,默认不可变,这种设计强制开发者主动思考的可变性需求,减少意外导致bug。先来创建一个项目hello_variable。
❯ cargo new hello_variable
Creating binary (application) `hello_variable` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
让后使用VSCode进入该项目中:

打开main.rs,接下来的代码编写主要在该文件中。
绑定与解构
首先先创建一个变量,rust中使用方法:let a = "hello world";,在其他语言中,这种方式一般被称为赋值,也就是将右侧的hello world赋值给左侧的a,但是在rust中,这个过程被称为变量绑定,具体原因就是rust中一个非常重要的机制---所有权机制导致,这个后面再详细说,这里简单说一下,因为所有权机制就是将内存对象与变量完全绑定在一起,让这个变量称为这个对象的主人,主人自然拥有对其掌控一切的权利。那么当内存对象绑定其他变量的时候,这个前主人自然也就被抛弃了,对这个对象再无任何权利。
变量的命名方式是蛇形命名法,这几乎是约定俗成的,当然,如果你习惯使用其他的也没事,只不过更推荐这种方式去命名,这有助于增加代码的可读性。
绑定变量:
let hello = "hello_rust";
let x = 5;
let y = 'a';
let z = 3.15;

可以看到,rust绑定变量还是很简单的,并且编译器会自动推导值的类型,这个后面再说,接下来看一看rust中变量的不可变性。
不可变与可变
在rust中,变量默认是不可变的,什么意思呢,就是当你使用上述方式绑定一个变量后,这个变量的值就不能再改变,也就是说,在这个作用域内,你不能再将这个变量修改为其他的值,如果修改了,会发生什么呢,让我们看看:
let b = 10;
b = 5;

可以看到编译器已经报错了,我们check一下看看:
❯ cargo check
Checking hello_variable v0.1.0 (/home/xvzhang/Workspace/dev/rust/study/hello_variable)
warning: variable `b` is assigned to, but never used
--> src/main.rs:2:9
|
2 | let b = 5;
| ^
|
= note: consider using `_b` instead
= note: `#[warn(unused_variables)]` on by default
warning: value assigned to `b` is never read
--> src/main.rs:3:5
|
3 | b = 5;
| ^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` on by default
error[E0384]: cannot assign twice to immutable variable `b`
--> src/main.rs:3:5
|
2 | let b = 5;
| - first assignment to `b`
3 | b = 5;
| ^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
2 | let mut b = 5;
| +++
For more information about this error, try `rustc --explain E0384`.
warning: `hello_variable` (bin "hello_variable") generated 2 warnings
error: could not compile `hello_variable` (bin "hello_variable") due to 1 previous error; 2 warnings emitted
具体的错误原因是cannot assign twice to immutable variable,意思是不能对不可变的变量进行重复赋值。
如果你想让你的变量可变,那么需要使用到mut关键字,这个关键字在后面还有许多妙用,现在看这里,修改刚刚我们的代码:
let mut b = 5;
b = 10;

可以看到,报错已经消除,让我们check一下:
❯ cargo check
warning: variable `b` is assigned to, but never used
--> src/main.rs:2:13
|
2 | let mut b = 5;
| ^
|
= note: consider using `_b` instead
= note: `#[warn(unused_variables)]` on by default
warning: value assigned to `b` is never read
--> src/main.rs:3:5
|
3 | b = 5;
| ^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` on by default
warning: `hello_variable` (bin "hello_variable") generated 2 warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.04s
已经从错误变成了警告,仅仅是变量未使用的警告。所以在开发时,你需要好好思考你声明的变量是否会发生改变,如果会,那么记得加上mut使它变得可变;如果你不确定,那不妨先加上,使其可变,开发完成之后再回来决定是否让它变得可变。
还有一点,上面示例中,不是出现警告有未使用的变量么,要解决这个警告,那么我们使用下划线开头来忽略未使用的变量,就像这样:
let mut _b = 5;
_b = 6;

check一下:
❯ cargo check
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.04s
警告完全消除。
其实,下划线的用处还可以让你声明一个匿名变量,这样声明:
let _ = 1;
匿名变量通常使用在有一个值不重要但是必须要绑定它的时候,比如忽略函数返回值或者match解构中忽略不需要的部分时,这点后面遇到再说,这里先留一个印象。
好了,说完变量绑定,就到变量解构了。
变量解构
let表达式不仅仅能绑定变量,还能从一个相对复杂的变量中,匹配该变量的一部分,比如说从一个元组中,正常来说你需要写好几行代码来绑定它的值,现在一行代码即可:
let (a, mut b): (bool, bool) = (true, true);
println!("a is {}, b is {}", a, b);
b = false;
println!("new b is {}", b);
运行一下:
❯ cargo run
Compiling hello_variable v0.1.0 (/home/xvzhang/Workspace/dev/rust/study/hello_variable)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.11s
Running `target/debug/hello_variable`
a is true, b is true
new b is false
这对于某些场景下的函数返回值简直就是福音,不仅如此,我们还可以使用解构这一特性,使用切片,结构体,集合等来对变量进行赋值。
变量遮蔽
rust有一个特别的设计,即可以使用let重复声明同名变量来遮蔽之前的值:
let a = 4;
let a = 10.1;
与mut不同,mut声明的变量,修改的时候是在同一块内存地址上进行修改,其中不会发生内存对象的再分配。而shadowing允许你修改变量的类型,它是生成了完全不同的新变量,两个变量只是恰好同名罢了,非常适合数据处理的场景,并且无需去绞尽脑汁的想变量名。
常量
常量的声明使用到const关键字,并且常量与变量不同,常量终身不可变,也就是说,不能使用mut来使常量可变,并且,常量声明时必须标注值的类型。常量的命名规则一般是全写蛇形命名法。
const MAX_POINTS: u32 = 100_000;
常量可以在任意作用域内声明,包括全局作用域,在声明的作用域内,常量在程序运行的整个过程中都有效。所以在实际使用时,最好将需要硬编码的值都声明为常量,这对后期维护有莫大的好处。
总结
Rust 的变量系统看似严格,实则是对开发者的保护:
- ✅ 默认不可变:强迫思考变量是否真的需要变化
- ✅ mut 关键字:明确声明「我准备修改它」
- ✅ 下划线
_ 命名:告诉编译器「我知道它未使用,别报警告」 - ✅ 解构绑定:复杂赋值一步到位
- ✅ 遮蔽(Shadowing) :可以修改变量类型或重新赋值
- ✅ 常量 const:保证永不改变的值
理解了变量,你就踏上了 Rust 大陆的第一块坚实岩石。
下一步,我们将探索 数据类型与所有权机制,在那里你会遇到 Borrow Checker 借用检查者,真正的 Rust BOSS 等你挑战!

浙公网安备 33010602011771号