From 864cacfcf0a0e967766f6e0c05bb96da7530c762 Mon Sep 17 00:00:00 2001 From: Nanami Nakano Date: Tue, 10 Oct 2023 12:41:05 -0500 Subject: [PATCH] add description of characteristics of constants --- src/basic/variable.md | 60 +++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/basic/variable.md b/src/basic/variable.md index 5a7e541c6..bd020e8d2 100644 --- a/src/basic/variable.md +++ b/src/basic/variable.md @@ -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 允许声明相同的变量名,在后面声明的变量会遮蔽掉前面声明的,如下所示: @@ -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 的类型世界,看看有哪些挑战在前面等着大家。