From 4fcadd769acc5e24bc727934f62ee597509a6d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E9=B1=BCa?= Date: Fri, 1 Aug 2025 18:11:51 +0800 Subject: [PATCH 1/4] Update index.md --- src/basic/base-type/index.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/basic/base-type/index.md b/src/basic/base-type/index.md index 94743d8d72..808b82e264 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 个字节 -- 单元类型:即 `()` ,其唯一的值也是 `()` ## 类型推导与标注 From a5e00fcbb6909fd50ef12e9ddcba88b318459abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E9=B1=BCa?= Date: Sat, 2 Aug 2025 15:56:00 +0800 Subject: [PATCH 2/4] fix: Fix the outdated error message --- src/basic/base-type/statement-expression.md | 22 ++++++--------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/basic/base-type/statement-expression.md b/src/basic/base-type/statement-expression.md index 31acf29efe..e074d14ee0 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 语句作为值赋给变量,违反了语法规则。 ## 表达式 From 5c2c8b8f6138fa715e41f9dc9e62b64f0b438ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E9=B1=BCa?= Date: Sat, 2 Aug 2025 16:30:28 +0800 Subject: [PATCH 3/4] pref: Optimise description accuracy --- src/basic/base-type/char-bool.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/basic/base-type/char-bool.md b/src/basic/base-type/char-bool.md index e984d640b4..b3b8054855 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字节。 ## 课后练习 From 1e057a5ce743dd698bdd54c72d9b32969fd16557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E9=B1=BCa?= Date: Sat, 2 Aug 2025 16:36:21 +0800 Subject: [PATCH 4/4] fix: Remove extra semicolons --- src/basic/base-type/statement-expression.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/base-type/statement-expression.md b/src/basic/base-type/statement-expression.md index e074d14ee0..127c424939 100644 --- a/src/basic/base-type/statement-expression.md +++ b/src/basic/base-type/statement-expression.md @@ -41,7 +41,7 @@ let b = (let a = 8); error: expected expression, found `let` statement // 期望表达式,却发现`let`语句 --> src/main.rs:3:10 | -3 | let b = (let a = 8);; +3 | let b = (let a = 8); | ^^^ | = note: only supported directly in conditions of `if` and `while` expressions // 允许通过 if let 和 while let 语法进行模式匹配