mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 08:51:18 +08:00
Merge branch 'master' of https://github.com/KaiserY/trpl-zh-cn
This commit is contained in:
commit
316e2f46bc
@ -245,7 +245,7 @@ println!("x = {}, y = {}", x, y);
|
||||
|
||||
Rust 有一个叫做`Copy` trait 的特殊注解,可以用在类似整型这样的储存在栈上的类型(第十章详细讲解 trait)。如果一个类型拥有`Copy` trait,一个旧的变量在(重新)赋值后仍然可用。Rust 不允许自身或其任何部分实现了`Drop` trait 的类型使用`Copy` trait。如果我们对其值离开作用域时需要特殊处理的类型使用`Copy`注解,将会出现一个编译时错误。关于如何为你的类型增加`Copy`注解,请阅读附录 C 中的 Derivable Trait。
|
||||
|
||||
那么什么类型是`Copy`的呢?可以查看给定类型的文档来确认,不过作为一个通用的规则,任何简单标量值的组合可以是`Copy`的,任何不需要分配内存或类似形式资源的类型是`Copy`的,如下是一些`Copy`的类型:
|
||||
那么什么类型是`Copy`的呢?可以查看给定类型的文档来确认,不过作为一个通用的规则,任何简单标量值的组合可以是`Copy`的,任何需要分配内存,或者本身就是某种形式资源的类型不会是`Copy`的。如下是一些`Copy`的类型:
|
||||
|
||||
* 所有整数类型,比如`u32`。
|
||||
* 布尔类型,`bool`,它的值是`true`和`false`。
|
||||
|
@ -245,7 +245,7 @@ struct StaticRef<T: 'static>(&'static T);
|
||||
|
||||
### trait 对象生命周期
|
||||
|
||||
在第十七章,我们学习了 trait 对象,它包含位于引用之后的 trait 用以使用动态分发。然而,我们并没有讨论如果 trait 对象中实现 trait 的类型带有生命周期时会发生什么。考虑一下 19-19,这里有 trait `Foo`,和带有一个实现了 trait `Foo` 的引用(因此还有其生命周期参数)的结构体 `Bar`,我们希望使用 `Bar` 的实例作为 trait 对象 `Box<Foo>`:
|
||||
在第十七章,我们学习了 trait 对象,其中介绍了可以把一个 trait 放在一个引用后面来进行动态分发。然而,我们并没有讨论如果 trait 对象中实现 trait 的类型带有生命周期时会发生什么。考虑一下 19-19,这里有 trait `Foo`,和带有一个实现了 trait `Foo` 的引用(因此还有其生命周期参数)的结构体 `Bar`,我们希望使用 `Bar` 的实例作为 trait 对象 `Box<Foo>`:
|
||||
|
||||
```rust
|
||||
trait Foo { }
|
||||
@ -270,6 +270,6 @@ let obj = Box::new(Bar { x: &num }) as Box<Foo>;
|
||||
* 如果只有 `T: 'a`, 则默认是 `'a`。
|
||||
* 如果有多个类似 `T: 'a` 的从句,则没有默认值;必须明确指定。
|
||||
|
||||
当必须明确指定时,可以为像 `Box<Foo>` 这样的 trait 对象增加生命周期 bound,根据需要使用语法 `Box<Foo + 'a>` 或 `Box<Foo + 'static>`。正如其他的 bound,这意味着任何包含引用的实现了 `Foo` trait 的类型,其中的引用必须拥有 trait 对象所指定的生命周期。
|
||||
当必须明确指定时,可以为像 `Box<Foo>` 这样的 trait 对象增加生命周期 bound,根据需要使用语法 `Box<Foo + 'a>` 或 `Box<Foo + 'static>`。正如其他的 bound,这意味着任何 `Foo` trait 的实现如果在内部包含有引用, 就必须在 trait 对象 bounds 中为那些引用指定生命周期。
|
||||
|
||||
接下来,让我们看看一些其他处理 trait 的功能吧!
|
||||
接下来,让我们看看一些其他处理 trait 的功能吧!
|
||||
|
@ -8,9 +8,9 @@
|
||||
|
||||
### 关联类型
|
||||
|
||||
**关联类型**(*associated types*)是一个将类型占位符与 trait 相关联的方法,如此 trait 的方法定义的签名中就可以使用这些占位符类型。实现 trait 的类型将会在特定实现中指定所用的具体类型。
|
||||
**关联类型**(*associated types*)是一个将类型占位符与 trait 相关联的方式,这样 trait 的方法签名中就可以使用这些占位符类型。实现一个 trait 的人只需要针对专门的实现在这个类型的位置指定相应的类型即可。
|
||||
|
||||
本章描述的大部分内容都非常少见。关联类型则比较适中;他们比本书其他的内容要少见,不过比本章很多的内容要更常见。
|
||||
本章描述的大部分内容都非常少见。关联类型则比较适中;他们比本书其他的内容要少见,不过比本章中的很多内容要更常见。
|
||||
|
||||
一个带有关联类型的 trait 的例子是标准库提供的 `Iterator` trait。它有一个叫做 `Item` 的关联类型来替代遍历的值的类型。第十三章曾提到过 `Iterator` trait 的定义如列表 19-20 所示:
|
||||
|
||||
@ -23,7 +23,7 @@ pub trait Iterator {
|
||||
|
||||
<span class="caption">列表 19-20:`Iterator` trait 的定义中带有关联类型 `Item`</span>
|
||||
|
||||
这就是说 `Iterator` trait 有一个关联类型 `Item`。`Item` 是一个占位类型,同时 `next` 方法会返回 `Option<Self::Item>` 类型的值。这个 trait 的实现者会指定 `Item` 的具体类型,而 `next` 方法会返回一个 `Option` 包含无论实现者指定的何种类型的值。
|
||||
这就是说 `Iterator` trait 有一个关联类型 `Item`。`Item` 是一个占位类型,同时 `next` 方法会返回 `Option<Self::Item>` 类型的值。这个 trait 的实现者会指定 `Item` 的具体类型,而不管实现者指定何种类型, `next` 方法都会返回一个包含了这种类型值的 `Option`。
|
||||
|
||||
#### 关联类型 vs 泛型
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user