Update Ch20

This commit is contained in:
Unisko PENG 2023-04-04 10:10:09 +08:00
parent 249c96626b
commit 579c4cf81c
3 changed files with 18 additions and 3 deletions

View File

@ -10,6 +10,5 @@ impl ThreadPool {
where
F: FnOnce() + Send + 'static,
{
}
}

View File

@ -13,7 +13,7 @@
### 通过提取出函数,而去除重复
泛型特性,实现了以占位符表示多种类型方式,而替换掉那些特定类型,从而消除了代码重复。在进入到泛型语法之前,那么就要首先来看看,怎样以不涉及泛型的,而是通过提取出函数,以将一些特定值用一个表示多个值的占位符加以替换,这样的方式消除重复。随后就会把这同样技巧,应用到提取出泛型函数上!经由了解怎样识别出重复代码,就可以提取出函数来,这样亦将发现那些可使用泛型特性的重复代码。
泛型特性,实现了以占位符表示多种类型方式,而替换掉那些特定类型,从而消除了代码重复。在进入到泛型语法之前,那么就要首先来看看,怎样以不涉及泛型的,而是通过提取出函数,而将一些特定值,用一个表示多个值的占位符加以替换,这样的方式消除重复。随后就会把这同样技巧,应用到提取出泛型函数上!经由了解怎样识别出重复代码,就可以提取出函数来,这样亦将发现那些可使用泛型特性的重复代码。
这里会以下面清单 10-1 中,找出清单里极大数的简短程序开始。

View File

@ -709,7 +709,23 @@ impl ThreadPool {
where
F: FnOnce() + Send + 'static,
{
}
}
```
由于这个 `FnOnce` 表示一个不会取参数,且返回的是单元类型 `()` 的闭包,因此咱们仍旧使用了 `FnOnce` 后的 `()`。就跟函数定义一样,返回值类型可以在签名中省略,但即使咱们没有参数,咱们仍需这对括号。
又一次,这仍是那个 `execute` 方法的极简实现:他什么也没做,但咱们只是在试着让咱们的代码编译。咱们再来对其加以检查:
```console
$ cargo check
Checking hello v0.1.0 (/home/lenny.peng/rust-lang-zh_CN/hello)
Finished dev [unoptimized + debuginfo] target(s) in 0.36s
```
他编译了!不过请注意,当咱们尝试 `cargo run` 并在浏览器中构造一次请求时,咱们将看到浏览器中,一些咱们在本章开头曾看到过的报错。咱们的库尚未真正调用传递给 `execute` 的那个闭包!
> 注意:咱们或许听说过与有着严格编译器语言,比如 Haskell 与 Rust有关的一种说法即 “若代码编译了,他就会工作。” 然而这种说法并非一概而论。咱们的项目编译了,但他绝对什么也没干!若咱们是在构建一个真实、完整的项目,那么此时就将是开始编写检查代码编译与否,*以及* 是否具有咱们想要的行为的单元测试的好时机。