add no. for zh exercises

This commit is contained in:
sunface
2022-03-02 22:11:56 +08:00
parent 4ba73b3969
commit cacd575998
15 changed files with 115 additions and 115 deletions

View File

@ -8,7 +8,7 @@ fn create_arr(n: i32) {
以上函数将报错,因为编译器无法在编译期知道 `n` 的具体大小。
🌟
1. 🌟
```rust,editable
fn main() {
@ -20,7 +20,7 @@ fn main() {
}
```
🌟🌟
2. 🌟🌟
```rust,editable
fn main() {
@ -35,7 +35,7 @@ fn main() {
}
```
🌟 数组中的所有元素可以一起初始化为同一个值
3. 🌟 数组中的所有元素可以一起初始化为同一个值
```rust,editable
fn main() {
@ -47,7 +47,7 @@ fn main() {
}
```
🌟 数组中的所有元素必须是同一类型
4. 🌟 数组中的所有元素必须是同一类型
```rust,editable
fn main() {
@ -56,7 +56,7 @@ fn main() {
}
```
🌟 数组的下标索引从 0 开始.
5. 🌟 数组的下标索引从 0 开始.
```rust,editable
fn main() {
@ -68,7 +68,7 @@ fn main() {
}
```
🌟 越界索引会导致代码的 `panic`.
6. 🌟 越界索引会导致代码的 `panic`.
```rust,editable
// 修复代码中的错误

View File

@ -1,5 +1,5 @@
# 枚举 Enum
🌟🌟 在创建枚举时,你可以使用显式的整数设定枚举成员的值。
1. 🌟🌟 在创建枚举时,你可以使用显式的整数设定枚举成员的值。
```rust,editable
@ -31,7 +31,7 @@ fn main() {
}
```
🌟 枚举成员可以持有各种类型的值
2. 🌟 枚举成员可以持有各种类型的值
```rust,editable
// 填空
@ -48,7 +48,7 @@ fn main() {
}
```
🌟🌟 枚举成员中的值可以使用模式匹配来获取
3. 🌟🌟 枚举成员中的值可以使用模式匹配来获取
```rust,editable
// 仅填空并修复错误
@ -70,7 +70,7 @@ fn main() {
}
```
🌟🌟 使用枚举对类型进行同一化
4. 🌟🌟 使用枚举对类型进行同一化
```rust,editable
@ -99,7 +99,7 @@ fn show_message(msg: Message) {
}
```
🌟🌟 Rust 中没有 `null`,我们通过 `Option<T>` 枚举来处理值为空的情况
5. 🌟🌟 Rust 中没有 `null`,我们通过 `Option<T>` 枚举来处理值为空的情况
```rust,editable
// 填空让 `println` 输出,同时添加一些代码不要让最后一行的 `panic` 执行到
@ -124,7 +124,7 @@ fn plus_one(x: Option<i32>) -> Option<i32> {
```
🌟🌟🌟🌟 使用枚举来实现链表.
6. 🌟🌟🌟🌟 使用枚举来实现链表.
```rust,editable

View File

@ -1,7 +1,7 @@
# 切片( Slice )
切片跟数组相似,但是切片的长度无法在编译期得知,因此你无法直接使用切片类型。
🌟🌟 这里, `[i32]``str` 都是切片类型,但是直接使用它们会造成编译错误,如下代码所示。为了解决,你需要使用切片的引用: `&[i32]`, `&str`.
1. 🌟🌟 这里, `[i32]``str` 都是切片类型,但是直接使用它们会造成编译错误,如下代码所示。为了解决,你需要使用切片的引用: `&[i32]`, `&str`.
```rust,editable
// 修复代码中的错误,不要新增代码行!
@ -17,7 +17,7 @@ fn main() {
切片( 引用 )可以用来借用数组的某个连续的部分,对应的签名是 `&[T]`,大家可以与数组的签名对比下 `[T; Length]`。
🌟🌟🌟
2. 🌟🌟🌟
```rust,editable
fn main() {
@ -31,7 +31,7 @@ fn main() {
}
```
🌟🌟
3. 🌟🌟
```rust,editable
fn main() {
@ -43,7 +43,7 @@ fn main() {
```
### 字符串切片
🌟
4. 🌟
```rust,editable
fn main() {
@ -57,7 +57,7 @@ fn main() {
}
```
🌟
5. 🌟
```rust,editable
fn main() {
@ -69,7 +69,7 @@ fn main() {
}
```
🌟🌟 `&String` 可以被隐式地转换成 `&str` 类型.
6. 🌟🌟 `&String` 可以被隐式地转换成 `&str` 类型.
```rust,editable
// 修复所有错误

View File

@ -3,7 +3,7 @@
### `str` 和 `&str`
🌟 正常情况下我们无法使用 `str` 类型,但是可以使用 `&str` 来替代
1. 🌟 正常情况下我们无法使用 `str` 类型,但是可以使用 `&str` 来替代
```rust,editable
@ -14,7 +14,7 @@ fn main() {
```
🌟🌟 如果要使用 `str` 类型,只能配合 `Box`。 `&` 可以用来将 `Box<str>` 转换为 `&str` 类型
2. 🌟🌟 如果要使用 `str` 类型,只能配合 `Box`。 `&` 可以用来将 `Box<str>` 转换为 `&str` 类型
```rust,editable
@ -32,7 +32,7 @@ fn greetings(s: &str) {
### String
`String` 是定义在标准库中的类型,分配在堆上,可以动态的增长。它的底层存储是动态字节数组的方式( `Vec<u8>` ),但是与字节数组不同,`String` 是 `UTF-8` 编码。
🌟
3. 🌟
```rust,editable
// 填空
@ -45,7 +45,7 @@ fn main() {
}
```
🌟🌟🌟
4. 🌟🌟🌟
```rust,editable
// 修复所有错误,并且不要新增代码行
@ -59,7 +59,7 @@ fn main() {
}
```
🌟🌟 我们可以用 `replace` 方法来替换指定的子字符串
5. 🌟🌟 我们可以用 `replace` 方法来替换指定的子字符串
```rust,editable
// 填空
@ -75,7 +75,7 @@ fn main() {
在标准库的 [String](https://doc.rust-lang.org/std/string/struct.String.html) 模块中,有更多的实用方法,感兴趣的同学可以看看。
🌟🌟 你只能将 `String` 跟 `&str` 类型进行拼接,并且 `String` 的所有权在此过程中会被 move
6. 🌟🌟 你只能将 `String` 跟 `&str` 类型进行拼接,并且 `String` 的所有权在此过程中会被 move
```rust,editable
@ -93,7 +93,7 @@ fn main() {
与 `str` 的很少使用相比,`&str` 和 `String` 类型却非常常用,因此也非常重要。
🌟🌟 我们可以使用两种方法将 `&str` 转换成 `String` 类型
7. 🌟🌟 我们可以使用两种方法将 `&str` 转换成 `String` 类型
```rust,editable
// 使用至少两种方法来修复错误
@ -107,7 +107,7 @@ fn greetings(s: String) {
}
```
🌟🌟 我们可以使用 `String::from` 或 `to_string` 将 `&str` 转换成 `String` 类型
8. 🌟🌟 我们可以使用 `String::from` 或 `to_string` 将 `&str` 转换成 `String` 类型
```rust,editable
@ -119,7 +119,7 @@ fn main() {
```
### 字符串转义
🌟
9. 🌟
```rust,editable
fn main() {
// 你可以使用转义的方式来输出想要的字符,这里我们使用十六进制的值,例如 \x73 会被转义成小写字母 's'
@ -144,7 +144,7 @@ fn main() {
```
🌟🌟🌟 有时候需要转义的字符很多,我们会希望使用更方便的方式来书写字符串: raw string.
10. 🌟🌟🌟 有时候需要转义的字符很多,我们会希望使用更方便的方式来书写字符串: raw string.
```rust,editable
fn main() {
@ -214,7 +214,7 @@ fn main() {
如果大家想要了解更多关于字符串字面量、转义字符的话,可以看看 Rust Reference 的 ['Tokens' 章节](https://doc.rust-lang.org/reference/tokens.html).
### 字符串索引string index
🌟🌟 你无法通过索引的方式去访问字符串中的某个字符,但是可以使用切片的方式 `&s1[start..end]` ,但是`start` 和 `end` 必须准确落在字符的边界处.
11. 🌟🌟 你无法通过索引的方式去访问字符串中的某个字符,但是可以使用切片的方式 `&s1[start..end]` ,但是`start` 和 `end` 必须准确落在字符的边界处.
```rust,editable
@ -229,7 +229,7 @@ fn main() {
```
### 操作 UTF-8 字符串
🌟
12. 🌟
```rust,editable
fn main() {

View File

@ -1,7 +1,7 @@
# 结构体
### 三种类型的结构体
🌟 对于结构体,我们必须为其中的每一个字段都指定具体的值
1. 🌟 对于结构体,我们必须为其中的每一个字段都指定具体的值
```rust,editable
// fix the error
@ -20,7 +20,7 @@ fn main() {
```
🌟 单元结构体没有任何字段。
2. 🌟 单元结构体没有任何字段。
```rust,editable
struct Unit;
@ -40,7 +40,7 @@ fn main() {
fn do_something_with_unit(u: __) { }
```
🌟🌟🌟 元组结构体看起来跟元组很像,但是它拥有一个结构体的名称,该名称可以赋予它一定的意义。由于它并不关心内部数据到底是什么名称,因此此时元组结构体就非常适合。
3. 🌟🌟🌟 元组结构体看起来跟元组很像,但是它拥有一个结构体的名称,该名称可以赋予它一定的意义。由于它并不关心内部数据到底是什么名称,因此此时元组结构体就非常适合。
```rust,editable
@ -61,7 +61,7 @@ fn check_color(p: Color) {
```
### 结构体上的一些操作
🌟 你可以在实例化一个结构体时将它整体标记为可变的,但是 Rust 不允许我们将结构体的某个字段专门指定为可变的.
4. 🌟 你可以在实例化一个结构体时将它整体标记为可变的,但是 Rust 不允许我们将结构体的某个字段专门指定为可变的.
```rust,editable
@ -85,7 +85,7 @@ fn main() {
}
```
🌟 使用结构体字段初始化缩略语法可以减少一些重复代码
5. 🌟 使用结构体字段初始化缩略语法可以减少一些重复代码
```rust,editable
// 填空
@ -103,7 +103,7 @@ fn build_person(name: String, age: u8) -> Person {
}
```
🌟 你可以使用结构体更新语法基于一个结构体实例来构造另一个
6. 🌟 你可以使用结构体更新语法基于一个结构体实例来构造另一个
```rust,editable
// 填空,让代码工作
@ -133,7 +133,7 @@ fn set_email(u: User) -> User {
```
### 打印结构体
🌟🌟 我们可以使用 `#[derive(Debug)]` 让[结构体变成可打印的](https://course.rs/basic/compound-type/struct.html#使用-derivedebug-来打印结构体的信息).
7. 🌟🌟 我们可以使用 `#[derive(Debug)]` 让[结构体变成可打印的](https://course.rs/basic/compound-type/struct.html#使用-derivedebug-来打印结构体的信息).
```rust,editable
@ -195,7 +195,7 @@ fn main() {
#### 练习
🌟🌟
8. 🌟🌟
```rust,editable
// 修复错误

View File

@ -1,5 +1,5 @@
# 元组( Tuple )
🌟 元组中的元素可以是不同的类型。元组的类型签名是 `(T1, T2, ...)`, 这里 `T1`, `T2` 是相对应的元组成员的类型.
1. 🌟 元组中的元素可以是不同的类型。元组的类型签名是 `(T1, T2, ...)`, 这里 `T1`, `T2` 是相对应的元组成员的类型.
```rust,editable
fn main() {
@ -11,7 +11,7 @@ fn main() {
}
```
🌟 可以使用索引来获取元组的成员
2. 🌟 可以使用索引来获取元组的成员
```rust,editable
// 修改合适的地方,让代码工作
@ -21,7 +21,7 @@ fn main() {
}
```
🌟 过长的元组无法被打印输出
3. 🌟 过长的元组无法被打印输出
```rust,editable
// 修复代码错误
@ -31,7 +31,7 @@ fn main() {
}
```
🌟 使用模式匹配来解构元组
4. 🌟 使用模式匹配来解构元组
```rust,editable
fn main() {
@ -46,7 +46,7 @@ fn main() {
}
```
🌟🌟 解构式赋值
5. 🌟🌟 解构式赋值
```rust,editable
fn main() {
let (x, y, z);
@ -60,7 +60,7 @@ fn main() {
}
```
🌟🌟 元组可以用于函数的参数和返回值
6. 🌟🌟 元组可以用于函数的参数和返回值
```rust,editable
fn main() {