diff --git a/src/basic/base-type/char-bool.md b/src/basic/base-type/char-bool.md index e984d640b..b3b805485 100644 --- a/src/basic/base-type/char-bool.md +++ b/src/basic/base-type/char-bool.md @@ -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字节。 ## 课后练习 diff --git a/src/basic/base-type/index.md b/src/basic/base-type/index.md index 94743d8d7..808b82e26 100644 --- a/src/basic/base-type/index.md +++ b/src/basic/base-type/index.md @@ -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 个字节 -- 单元类型:即 `()` ,其唯一的值也是 `()` ## 类型推导与标注 diff --git a/src/basic/base-type/statement-expression.md b/src/basic/base-type/statement-expression.md index 31acf29ef..127c42493 100644 --- a/src/basic/base-type/statement-expression.md +++ b/src/basic/base-type/statement-expression.md @@ -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 for more information - = help: you can write `matches!(, )` instead of `let = ` + = 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 语句作为值赋给变量,违反了语法规则。 ## 表达式