pull/470/head
sunface 3 years ago
commit 21c4eef641

@ -257,7 +257,7 @@ help: function arguments must have a statically known size, borrowed types alway
回忆一下泛型章节我们提到过的,泛型是在编译期完成处理的:编译器会为每一个泛型参数对应的具体类型生成一份代码,这种方式是**静态分发(static dispatch)**,因为是在编译期完成的,对于运行期性能完全没有任何影响。
与静态分发相对应的是**动态分发(dynamic dispatch)**,在这种情况下,直到运行时,才能确定需要调用什么方法。
与静态分发相对应的是**动态分发(dynamic dispatch)**,在这种情况下,直到运行时,才能确定需要调用什么方法。之前代码中的关键字 `dyn` 正是在强调这一“动态”的特点。
当使用特征对象时Rust 必须使用动态分发。编译器无法知晓所有可能用于特征对象代码的类型所以它也不知道应该调用哪个类型的哪个方法实现。为此Rust 在运行时使用特征对象中的指针来知晓需要调用哪个方法。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。

@ -207,7 +207,7 @@ fn some_function<T, U>(t: &T, u: &U) -> i32
{
```
#### 使用特征约束有条件实现方法或特征
#### 使用特征约束有条件实现方法或特征
特征约束,可以让我们在指定类型 + 指定特征的条件下去实现方法,例如:
```rust
use std::fmt::Display;
@ -240,7 +240,7 @@ impl<T: Display + PartialOrd> Pair<T> {
`cmd_display` 方法,并不是所有的 `Pair<T>` 结构体对象都可以拥有,只有 `T` 同时实现了 `Display + PartialOrd``Pair<T>` 才可以拥有此方法。
该函数可读性会更好,因为泛型参数、参数、返回值都在一起,可以快速的阅读,同时每个泛型参数的特征也在新的代码行中通过**特征约束**进行了约束。
**也可以有条件实现特征**, 例如,标准库为任何实现了 `Display` 特征的类型实现了 `ToString` 特征:
**也可以有条件实现特征**, 例如,标准库为任何实现了 `Display` 特征的类型实现了 `ToString` 特征:
```rust
impl<T: Display> ToString for T {
// --snip--

Loading…
Cancel
Save