Merge pull request #1556 from Aurzex/base-type-patch

fix: Optimization notes for the "Base Type" chapter
pull/1569/head
Sunface 2 months ago committed by GitHub
commit ebdb77e7d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -19,7 +19,7 @@ fn main() {
如果大家是从有年代感的编程语言过来,可能会大喊一声:这 XX 叫字符?是的,在 Rust 语言中这些都是字符Rust 的字符不仅仅是 `ASCII`,所有的 `Unicode` 值都可以作为 Rust 字符包括单个的中文、日文、韩文、emoji 表情符号等等,都是合法的字符类型。`Unicode` 值的范围从 `U+0000 ~ U+D7FF``U+E000 ~ U+10FFFF`。不过“字符”并不是 `Unicode` 中的一个概念,所以人在直觉上对“字符”的理解和 Rust 的字符概念并不一致。
由于 `Unicode` 都是 4 个字节编码,因此字符类型也是占用 4 个字节
`char`类型表示一个 `Unicode` 标量值Unicode Scalar Value它占用固定的 4 字节32 位) 内存(与 UTF-32 编码单元一致)
```rust
fn main() {
@ -63,11 +63,11 @@ fn main() {
只能说,再不起眼的东西,都有其用途,在目前为止的学习过程中,大家已经看到过很多次 `fn main()` 函数的使用吧?那么这个函数返回什么呢?
没错, `main` 函数就返回这个单元类型 `()`你不能说 `main` 函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:`发散函数( diverging functions )`,顾名思义,无法收敛的函数。
没错, `main` 函数就返回这个单元类型 `()`因此 `main` 函数有返回值,而没有返回值的函数在 Rust 中是有单独的定义的:`发散函数( diverging functions )-> !`,顾名思义,无法收敛的函数。
例如常见的 `println!()` 的返回值也是单元类型 `()`
再比如,你可以用 `()` 作为 `map` 的值,表示我们不关注具体的值,只关注 `key`。 这种用法和 Go 语言的 ***struct{}*** 类似,可以作为一个值用来占位,但是完全**不占用**任何内存。
再比如,你可以用 `()` 作为 `map` 的值,表示我们不关注具体的值,只关注 `key`。 这种用法和 Go 语言的 ***struct{}*** 类似,可以作为一个值用来占位,但是完全**不占用**任何内存内存占用为0字节
## 课后练习

@ -2,13 +2,24 @@
当一门语言不谈类型时你得小心这大概率是动态语言别拍我我承认是废话。但是把类型大张旗鼓的用多个章节去讲的Rust 是其中之一。
Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型。 基本类型意味着它们往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),由以下组成:
Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型。基本类型意味着它们往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),由以下组成:
- **数值类型**
- 有符号整数:`i8` `i16`, `i32`, `i64`, `i128`, `isize`
- 无符号整数:`u8` `u16`, `u32`, `u64`, `u128`, `usize`
- 浮点数:`f32`(单精度), `f64`(双精度,默认)
> **注意**
> `isize``usize` 的大小取决于目标平台的指针大小32 位平台为 4 字节64 位平台为 8 字节)
- **字符串切片**`&str`
- **布尔类型**`true` 和 `false`
- **字符类型**`char` 表示单个 Unicode 字符(存储为 4 字节),如 `'A'`, `'中'`, `'😻'`
- **单元类型**`()`,其唯一可能的值也是 `()`
- 数值类型:有符号整数 (`i8`, `i16`, `i32`, `i64`, `isize`)、 无符号整数 (`u8`, `u16`, `u32`, `u64`, `usize`) 、浮点数 (`f32`, `f64`)、以及有理数、复数
- 字符串:字符串字面量和字符串切片 `&str`
- 布尔类型:`true` 和 `false`
- 字符类型:表示单个 Unicode 字符,存储为 4 个字节
- 单元类型:即 `()` ,其唯一的值也是 `()`
## 类型推导与标注

@ -38,27 +38,17 @@ let b = (let a = 8);
错误如下:
```console
error: expected expression, found statement (`let`) // 期望表达式,却发现`let`语句
--> src/main.rs:2:13
error: expected expression, found `let` statement // 期望表达式,却发现`let`语句
--> src/main.rs:3:10
|
2 | let b = let a = 8;
| ^^^^^^^^^
3 | let b = (let a = 8);
| ^^^
|
= note: variable declaration using `let` is a statement `let`是一条语句
error[E0658]: `let` expressions in this position are experimental
// 下面的 `let` 用法目前是试验性的,在稳定版中尚不能使用
--> src/main.rs:2:13
|
2 | let b = let a = 8;
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: you can write `matches!(<expr>, <pattern>)` instead of `let <pattern> = <expr>`
= note: only supported directly in conditions of `if` and `while` expressions // 允许通过 if let 和 while let 语法进行模式匹配
```
以上的错误告诉我们 `let` 是语句,不是表达式,因此它不返回值,也就不能给其它变量赋值。但是该错误还透漏了一个重要的信息, `let` 作为表达式已经是试验功能了,也许不久的将来,我们在 [`stable rust`](https://course.rs/appendix/rust-version.html) 下可以这样使用
以上的错误告诉我们 `let` 是语句,不是表达式,因此它不返回值,也就不能给其它变量赋值。试图将 let 语句作为值赋给变量,违反了语法规则。
## 表达式

Loading…
Cancel
Save