2022-02-24 01:50:01 -06:00
|
|
|
# 变量绑定与解构
|
|
|
|
|
|
|
|
### 绑定和可变性
|
2022-03-02 08:11:56 -06:00
|
|
|
1. 🌟 变量只有在初始化后才能被使用
|
2022-02-24 01:50:01 -06:00
|
|
|
|
|
|
|
```rust,editable
|
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
// 修复下面代码的错误并尽可能少的修改
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
|
|
|
let x: i32; // 未初始化,但被使用
|
|
|
|
let y: i32; // 未初始化,也未被使用
|
2022-04-19 03:44:18 -05:00
|
|
|
println!("x is equal to {}", x);
|
2022-02-24 01:50:01 -06:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2022-03-02 08:11:56 -06:00
|
|
|
2. 🌟🌟 可以使用 `mut` 将变量标记为可变
|
2022-02-24 01:50:01 -06:00
|
|
|
```rust,editable
|
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
// 完形填空,让代码编译
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
2022-07-04 06:51:02 -05:00
|
|
|
let __ = 1;
|
2022-02-24 01:50:01 -06:00
|
|
|
__ += 2;
|
|
|
|
|
2022-04-19 03:44:18 -05:00
|
|
|
println!("x = {}", x);
|
2022-02-24 01:50:01 -06:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 变量作用域
|
2022-03-02 08:11:56 -06:00
|
|
|
3. 🌟 作用域是一个变量在程序中能够保持合法的范围
|
2022-02-28 03:06:50 -06:00
|
|
|
|
2022-02-24 01:50:01 -06:00
|
|
|
```rust,editable
|
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
// 修复下面代码的错误并使用尽可能少的改变
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
|
|
|
let x: i32 = 10;
|
|
|
|
{
|
|
|
|
let y: i32 = 5;
|
|
|
|
println!("x 的值是 {}, y 的值是 {}", x, y);
|
|
|
|
}
|
|
|
|
println!("x 的值是 {}, y 的值是 {}", x, y);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2022-03-02 08:11:56 -06:00
|
|
|
4. 🌟🌟
|
2022-02-24 01:50:01 -06:00
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
```rust,editable
|
|
|
|
// 修复错误
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
|
|
|
println!("{}, world", x);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn define_x() {
|
|
|
|
let x = "hello";
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 变量遮蔽( Shadowing )
|
2022-03-02 08:11:56 -06:00
|
|
|
5. 🌟🌟 若后面的变量声明的名称和之前的变量相同,则我们说:第一个变量被第二个同名变量遮蔽了( shadowing )
|
2022-02-24 01:50:01 -06:00
|
|
|
|
|
|
|
```rust,editable
|
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
// 只允许修改 `assert_eq!` 来让 `println!` 工作(在终端输出 `42`)
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
|
|
|
let x: i32 = 5;
|
|
|
|
{
|
|
|
|
let x = 12;
|
|
|
|
assert_eq!(x, 5);
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_eq!(x, 12);
|
|
|
|
|
2022-07-04 06:51:02 -05:00
|
|
|
let x = 42;
|
2022-02-24 01:50:01 -06:00
|
|
|
println!("{}", x); // 输出 "42".
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2022-03-02 08:11:56 -06:00
|
|
|
6. 🌟🌟 删除一行代码以通过编译
|
2022-02-24 01:50:01 -06:00
|
|
|
```rust,editable
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let mut x: i32 = 1;
|
|
|
|
x = 7;
|
|
|
|
// 遮蔽且再次绑定
|
|
|
|
let x = x;
|
|
|
|
x += 3;
|
|
|
|
|
|
|
|
|
|
|
|
let y = 4;
|
|
|
|
// 遮蔽
|
|
|
|
let y = "I can also be bound to text!";
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 未使用的变量
|
2022-03-02 08:11:56 -06:00
|
|
|
7. 使用以下方法来修复编译器输出的 warning :
|
2022-02-24 01:50:01 -06:00
|
|
|
|
|
|
|
- 🌟 一种方法
|
|
|
|
- 🌟🌟 两种方法
|
|
|
|
|
|
|
|
> 注意: 你可以使用两种方法解决,但是它们没有一种是移除 `let x = 1` 所在的代码行
|
|
|
|
|
|
|
|
```rust,editable
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let x = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// compiler warning: unused variable: `x`
|
|
|
|
```
|
|
|
|
|
|
|
|
### 变量解构
|
2022-03-02 08:11:56 -06:00
|
|
|
8. 🌟🌟 我们可以将 `let` 跟一个模式一起使用来解构一个元组,最终将它解构为多个独立的变量
|
2022-02-24 01:50:01 -06:00
|
|
|
|
|
|
|
> 提示: 可以使用变量遮蔽或可变性
|
|
|
|
|
|
|
|
```rust,editable
|
|
|
|
|
2022-02-28 03:06:50 -06:00
|
|
|
// 修复下面代码的错误并尽可能少的修改
|
2022-02-24 01:50:01 -06:00
|
|
|
fn main() {
|
|
|
|
let (x, y) = (1, 2);
|
|
|
|
x += 2;
|
|
|
|
|
|
|
|
assert_eq!(x, 3);
|
|
|
|
assert_eq!(y, 2);
|
|
|
|
}
|
2022-02-24 21:18:27 -06:00
|
|
|
```
|
|
|
|
|
|
|
|
### 解构式赋值
|
2022-02-28 03:06:50 -06:00
|
|
|
该功能于 Rust 1.59 版本引入:你可以在赋值语句的左式中使用元组、切片或结构体进行匹配赋值。
|
2022-02-24 21:18:27 -06:00
|
|
|
|
2022-03-02 08:11:56 -06:00
|
|
|
9. 🌟🌟
|
2022-02-24 21:18:27 -06:00
|
|
|
|
|
|
|
> Note: 解构式赋值只能在 Rust 1.59 或者更高版本中使用
|
|
|
|
|
|
|
|
```rust,editable
|
|
|
|
|
|
|
|
fn main() {
|
2022-02-28 03:06:50 -06:00
|
|
|
let (x, y);
|
|
|
|
(x,..) = (3, 4);
|
|
|
|
[.., y] = [1, 2];
|
|
|
|
// 填空,让代码工作
|
|
|
|
assert_eq!([x,y], __);
|
2022-02-24 21:18:27 -06:00
|
|
|
}
|
2022-03-01 08:06:38 -06:00
|
|
|
```
|
|
|
|
|
2022-03-26 00:38:14 -06:00
|
|
|
> [答案](https://github.com/sunface/rust-by-practice/blob/master/solutions/variables.md) 在 solutions 下面
|