mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2024-12-26 04:40:33 +08:00
Update Ch15
This commit is contained in:
parent
3bf21ebb0e
commit
20df37f349
@ -469,12 +469,12 @@ fn main() {
|
||||
- 当 `T: DerefMut<Target=U>` 时,会从 `&mut T` 转换为 `&mut U`;
|
||||
- 当 `T: Deref<Target=U>` 时,会从 `&mut T` 转换为 `&U`。
|
||||
|
||||
其中前两个情形,除了第二种实现了可变外,他们是同样的。第一种情形指出了在咱们有着一个 `&T`,且 `T` 对某种类型 `U` 实现了 `Deref` 特质,那么就显然能得到一个 `&U`。第二种情形则指出了对可变引用,同样会发生解引用强制转换。
|
||||
前两种情况彼此相同,只是第二种情况实现了可变性。第一种情况表明,如果咱们有一个 `&T`,并且 `T` 实现了对某种类型 `U` 的 `Deref`,咱们可以透明地得到一个 `&U`。第二种情况表明相同的解引用强制转换发生在可变引用上。
|
||||
|
||||
那第三中情形就较为复杂了:Rust 还将把某个可变引用,强制转换为一个不可变引用。但反过来则是 *不* 可行的:不可变引用绝不会强制转换为可变引用。由于借用规则的存在,在有着某个可变引用时,那个可变引用必定只会是到那个数据的引用(否则,程序就不会编译)。将一个可变引用转换为一个不可变引用,是绝不会破坏借用规则的。而将不可变引用转换为可变引用,就会要求那个初始不可变引用,为到那个数据的唯一不可变引用,但借用规则却不会确保那一点。因此,Rust 就无法做出将不可变引用,转换为可变引用可行这一假定。
|
||||
第三种情况比较棘手:Rust 还会将可变引用强制转换为不可变引用。但反过来是 *不* 可行的:不可变引用永远不会强制转换为可变引用。由于借用规则,如果咱们有一个可变引用,则该可变引用必须是对那个数据的唯一引用(否则,程序将无法编译)。将一个可变引用转换为一个不可变引用永远不会违反借用规则。将不可变引用转换为可变引用,则要求那个初始不可变引用是对那个数据的唯一不可变引用,但借用规则并不能保证这一点。因此,Rust 不能假设将不可变引用转换为可变引用是可行的。
|
||||
|
||||
|
||||
## 使用 `Drop` 特质在清理内存时运行代码
|
||||
## 使用 `Drop` 特质运行清理代码
|
||||
|
||||
**Running Code on Cleanup with `Drop` Trait**
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user