Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/basic/base-type/char-bool.md
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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字节


## 课后练习
Expand Down
23 changes: 17 additions & 6 deletions src/basic/base-type/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 个字节
- 单元类型:即 `()` ,其唯一的值也是 `()`

## 类型推导与标注

Expand Down
22 changes: 6 additions & 16 deletions src/basic/base-type/statement-expression.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 语句作为值赋给变量,违反了语法规则

## 表达式

Expand Down