Remove Ch22

This commit is contained in:
Peng Hailin, 2023-04-13 06:16:31 +08:00
parent 0e51754616
commit ba92c37dd1
4 changed files with 51 additions and 47 deletions

View File

@ -347,7 +347,7 @@ enum Result <T, E> {
`Result` 枚举对 `T``E` 两种类型通用,并有着两个变种:保存了一个类型 `T` 值的 `Ok`,与保存了一个类型 `E` 值的 `Err`。这个定义使得在某个操作可能成功(便返回某种类型 `T` 的一个值),或失败(便返回一个某种类型 `E` 的值)的地方,使用 `Result` 枚举方便起来。事实上,这正是咱们在清单 9-3 中,打开某个文件时所用到的,在文件被成功打开时,其中的 `T` 就以 `std::fs::File` 给填上了,而当打开那个文件时,若存在某些问题,那么其中的 `E` 就会被 `std::io::Error` 填充。
当咱们认识到咱们的代码中,有着仅在其所保存值类型有区别的多个结构体或枚举的情况时,咱们就可以通过使用泛型避免代码重复。
当咱们认识到咱们的代码中,有着仅在其所保存值类型方面有区别的多个结构体或枚举的情况时,咱们就可以通过使用泛型避免代码重复。
### 在方法定义中
@ -443,9 +443,9 @@ fn main() {
### 使用泛型参数代码的性能问题
咱们或许想知道,在运用了泛型参数时,是否有着运行时的开销。好消息就是,相比于使用具体类型,使用泛型不会令到程序运行得更慢。
咱们或许想知道,在运用了泛型参数时,是否有着运行时的开销。好消息就是,相比于使用具体类型,使用泛型不会令到咱们的程序运行得更慢。
Rust 通过在编译时,完成那些使用了泛型代码的单态化performing monomorphization of the code using generics实现了这一点。所谓 *单态化monomorphization*,即通过将在编译后用到的具体类型填入进去,而将通用代码转换为具体代码的过程。在此过程中,编译器会执行与清单 10-5 中曾创建通用函数相反的步骤:编译器会查看所有泛型代码被调用到的地方,并生成调用到泛型代码的那些具体类型的代码。
Rust 通过在编译时,完成那些使用了泛型代码的单态化performing monomorphization of the code using generics达成这个目的。所谓 *单态化monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。在此过程中,编译器会执行与清单 10-5 中曾创建通用函数相反的步骤:编译器会查看所有泛型代码被调用到的地方,并生成调用到泛型代码的那些具体类型的代码。
下面就来通过使用标准库的通用 `Option<T>` 枚举,看看单态化的工作原理:

View File

@ -741,4 +741,51 @@ $ rustup override set nightly
过了一段时间后,一旦那些用到每日发布的 Rust 开发者们,能够试用这项新特性,那么 Rust 团队成员将讨论这项特性,怎样将其编制到每日发布上,并决定其是否有那个被构造到稳定发布 Rust。而若决定是继续推进那么特性门就会被移除同时这项特性就被认为是稳定的了他就会搭上列车进到一个新的稳定发布 Rust 中。
<全书完>
## 附录 H - 术语清单
### 单态化monomorphization
所谓 *单态化monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。参考 [使用泛型代码的性能问题](Ch10_Generic_Types_Traits_and_Lifetimes.md#使用泛型参数代码的性能问题)。
## 附录 I - 有用笔记
此处记录学习及应用 Rust 编程软件过程中,觉得有用的一些东西。
## `cargo-binutils`
[这个项目](https://github.com/rust-embedded/cargo-binutils) 是 Embbeded-Rust 项目的,而不是 Rust 官方的,但提供了有用的功能。比如查看构建出的二进制程序文件的那些头部:
```console
$ cargo readobj --bin clippy_demo -- --file-headers
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x86D0
Start of program headers: 64 (bytes into file)
Start of section headers: 4305200 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 12
Size of section headers: 64 (bytes)
Number of section headers: 42
Section header string table index: 41
```
使用前需要进行如下安装:
```console
$ cargo install cargo-binutils
$ rustup component add llvm-tools-preview
```

View File

@ -1,41 +0,0 @@
# 有用笔记
此处记录学习及应用 Rust 编程软件过程中,觉得有用的一些东西。
## `cargo-binutils`
[这个项目](https://github.com/rust-embedded/cargo-binutils) 是 Embbeded-Rust 项目的,而不是 Rust 官方的,但提供了有用的功能。比如查看构建出的二进制程序文件的那些头部:
```console
$ cargo readobj --bin clippy_demo -- --file-headers
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x86D0
Start of program headers: 64 (bytes into file)
Start of section headers: 4305200 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 12
Size of section headers: 64 (bytes)
Number of section headers: 42
Section header string table index: 41
```
使用前需要进行如下安装:
```console
$ cargo install cargo-binutils
$ rustup component add llvm-tools-preview
```

View File

@ -62,5 +62,3 @@
- [最后项目:构建一个多线程的 Web 服务器](Ch20_Final_Project_Building_a_Multithreaded_Web_Server.md)
- [附录](Ch21_Appendix.md)
- [一些有用的 Tips](Ch22_Useful_Tips.md)