Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add description of characteristics of constants #1304

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
60 changes: 41 additions & 19 deletions src/basic/variable.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,25 +168,6 @@ fn main() {

> 这里用到了模式匹配的一些语法,如果大家看不懂没关系,可以在学完模式匹配章节后,再回头来看。

## 变量和常量之间的差异

变量的值不能更改可能让你想起其他另一个很多语言都有的编程概念:**常量**(_constant_)。与不可变变量一样,常量也是绑定到一个常量名且不允许更改的值,但是常量和变量之间存在一些差异:

- 常量不允许使用 `mut`。**常量不仅仅默认不可变,而且自始至终不可变**,因为常量在编译完成后,已经确定它的值。
- 常量使用 `const` 关键字而不是 `let` 关键字来声明,并且值的类型**必须**标注。

我们将在下一节[数据类型](https://course.rs/basic/base-type/index.html)中介绍,因此现在暂时无需关心细节。

下面是一个常量声明的例子,其常量名为 `MAX_POINTS`,值设置为 `100,000`。(Rust 常量的命名约定是全部字母都使用大写,并使用下划线分隔单词,另外对数字字面量可插入下划线以提高可读性):

```rust
const MAX_POINTS: u32 = 100_000;
```

常量可以在任意作用域内声明,包括全局作用域,在声明的作用域内,常量在程序运行的整个过程中都有效。对于需要在多处代码共享一个不可变的值时非常有用,例如游戏中允许玩家赚取的最大点数或光速。

> 在实际使用中,最好将程序中用到的硬编码值都声明为常量,对于代码后续的维护有莫大的帮助。如果将来需要更改硬编码的值,你也只需要在代码中更改一处即可。

## 变量遮蔽(shadowing)

Rust 允许声明相同的变量名,在后面声明的变量会遮蔽掉前面声明的,如下所示:
Expand Down Expand Up @@ -254,6 +235,47 @@ error: aborting due to previous error

显然,Rust 对类型的要求很严格,不允许将整数类型 `usize` 赋值给字符串类型。`usize` 是一种 CPU 相关的整数类型,在[数值类型](https://course.rs/basic/base-type/numbers.html#整数类型)中有详细介绍。

## 变量和常量之间的差异

变量的值不能更改可能让你想起其他另一个很多语言都有的编程概念:**常量**(_constant_)。与不可变变量一样,常量也是绑定到一个常量名且不允许更改的值,但是常量和变量之间存在一些差异:

- 常量不允许使用 `mut`。**常量不仅仅默认不可变,而且自始至终不可变**,因为常量在编译完成后,已经确定它的值。
- 常量使用 `const` 关键字而不是 `let` 关键字来声明,并且值的类型**必须**标注。
- 常量不能被遮蔽。

我们将在下一节[数据类型](https://course.rs/basic/base-type/index.html)中介绍,因此现在暂时无需关心细节。

下面是一个常量声明的例子,其常量名为 `MAX_POINTS`,值设置为 `100,000`。(Rust 常量的命名约定是全部字母都使用大写,并使用下划线分隔单词,另外对数字字面量可插入下划线以提高可读性):

```rust
const MAX_POINTS: u32 = 100_000;
```

常量可以在任意作用域内声明,包括全局作用域,在声明的作用域内,常量在程序运行的整个过程中都有效。对于需要在多处代码共享一个不可变的值时非常有用,例如游戏中允许玩家赚取的最大点数或光速。

如果遮蔽一个常量,编译器会报错:

```rust
const MAX_POINTS: u32 = 100_000;
let MAX_POINTS = 100_001;
```

```console
error[E0005]: refutable pattern in local binding
--> src/main.rs:3:9
|
3 | let MAX_POINTS = 100_001;
| ^^^^^^^^^^
| |
| patterns `0_u32..=99999_u32` and `100001_u32..=u32::MAX` not covered
| missing patterns are not covered because `MAX_POINTS` is interpreted as a constant pattern, not a new variable
| help: introduce a variable instead: `MAX_POINTS_var`
|
```

> 在实际使用中,最好将程序中用到的硬编码值都声明为常量,对于代码后续的维护有莫大的帮助。如果将来需要更改硬编码的值,你也只需要在代码中更改一处即可。


万事开头难,到目前为止,都进展很顺利,那下面开始,咱们正式进入 Rust 的类型世界,看看有哪些挑战在前面等着大家。


Expand Down