mirror of
https://github.com/sunface/rust-by-practice.git
synced 2025-06-25 21:49:41 +00:00
add no. for zh exercises
This commit is contained in:
@ -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
|
||||
|
||||
// 修复代码中的错误
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
// 修复所有错误
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
||||
// 修复错误
|
||||
|
@ -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() {
|
||||
|
Reference in New Issue
Block a user