目录
[1. 变量与可变性](#1. 变量与可变性)
[1.1 不可变性](#1.1 不可变性)
[1.2 可变性](#1.2 可变性)
[2. 常量](#2. 常量)
[2.1 定义与特性](#2.1 定义与特性)
[3. 变量遮蔽(shadowing)](#3. 变量遮蔽(shadowing))
[3.1 影子机制](#3.1 影子机制)
[3.2 遮蔽与可变性的区别](#3.2 遮蔽与可变性的区别)
[4.1 变量和可变性示例](#4.1 变量和可变性示例)
[4.2 可变变量示例:](#4.2 可变变量示例:)
[4.3 常量示例:](#4.3 常量示例:)
[4.4 遮蔽示例:](#4.4 遮蔽示例:)
思维导图
1. 变量与可变性
1.1 不可变性
- 默认特性:在Rust中,变量默认是不可变的。这种设计旨在提高代码的安全性和并发性,避免因意外修改变量而引发的错误。
1.2 可变性
- 声明可变变量 :可以通过在变量前添加
mut
关键字将变量声明为可变。例如,let mut x = 5;
允许后续对x
的值进行修改。
2. 常量
2.1 定义与特性
- 不可变性 :常量是始终不可变的,使用
const
关键字声明,且必须注释类型。 - 作用域:常量可以在任何作用域中声明,包括全局作用域,适用于需要多个部分共享的值。
3. 变量遮蔽(shadowing)
3.1 影子机制
- 定义 :可以通过重复使用
let
关键字来声明与之前变量同名的新变量,这称为"影子"。
3.2 遮蔽与可变性的区别
- 编译时错误 :如果尝试在不使用
let
的情况下重新赋值,将会导致编译错误。遮蔽机制允许开发者在不改变原始变量的情况下对其进行转换。 - 类型变化:遮蔽还允许在重新声明时改变变量的类型,例如将字符串类型的变量重新声明为数字类型。
4.示例
4.1 变量和可变性示例
不可变变量示例:
fn main() {
let x = 5;
println!("The value of x is: {x}");
x = 6; // 这里会产生错误
println!("The value of x is: {x}");
}
编译错误信息:
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| first assignment to `x`
3 | println!("The value of x is: {x}");
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
4.2 可变变量示例:
fn main() {
let mut x = 5;
println!("The value of x is: {x}");
x = 6; // 这里可以成功赋值
println!("The value of x is: {x}");
}
运行输出:
The value of x is: 5
The value of x is: 6
4.3 常量示例:
#![allow(unused)]
fn main() {
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
}
4.4 遮蔽示例:
fn main() {
let x = 5;
let x = x + 1; // 创建一个新的变量x
{
let x = x * 2; // 在内部作用域中再次创建新的变量x
println!("The value of x in the inner scope is: {x}");
}
println!("The value of x is: {x}"); // 输出外部作用域的x
}
运行输出:
The value of x in the inner scope is: 12
The value of x is: 6