主要观点:提出通过引入Overwrite
特质来减少 Rust 中的互过程借用检查错误,增加代码的清晰度,使Pin
操作更简单。具体内容如下:
- TL;DR:若限制对
&mut
引用的可覆盖性,可减少借用检查错误,增加清晰度,简化Pin
操作。大多数结构体和枚举默认实现Overwrite
,未来版本可改为默认不实现,需显式声明T: Overwrite
边界。 - 结构系列:此博客是一个系列的一部分,包括介绍不可变字段的理念、深入探讨
Pin
与Overwrite
特质的关系等。 - 若能改变 Rust 的一件事:认为当前 Rust 中给定
x: &mut SomeStruct
可直接覆盖整个值,这使借用和固定操作更复杂,提出用特质替代新的引用类型来解决。 - 动机示例 1:不可变字段:Rust 中局部变量默认不可变,字段的可变性从外部继承。若将字段声明为
mut
,则只有在结构体出现在可变位置且字段声明为mut
时才能修改。但仅声明字段为mut
不够,因为字段可间接修改。例如Analyzer
结构体,data
字段不可变,important
字段可变。在increment_if_important
方法中,由于存在共享借用,当前 Rust 代码无法编译。 - 回顾:区分字段的可变与不可变可消除许多函数间的借用检查错误,但仅添加
mut
声明不够,因为字段可间接修改,且通用代码如std::mem::swap
会导致问题。 - 特质系统来解决:引入
Overwrite
特质,作为标记特质表示类型可被覆盖。Overwrite
要求Sized
,仅适用于借用值,不是感染性的,某些类型默认实现Overwrite
,如Copy
类型、指针类型,而dyn
、[]
等无静态大小的类型不实现。结构体和枚举在 Rust 2021 中默认实现Overwrite
,未来版本可改为默认不实现。默认边界相关问题需考虑,关联类型边界较麻烦但可通过关联类型别名解决。 - 常见问题:回顾主要内容,解释此更改不仅为获取不可变字段,后续将展示如何消除
Pin
的使用痛点,以及Overwrite
与Unpin
的关系等。
结论:通过引入Overwrite
特质等方式可改善 Rust 代码的一些问题,希望后续不会因明显缺陷而撤回该想法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。